3

У меня есть модель пользователя и модель группы. Пользователь и группа разделяют многие отношения. Когда я переводил это в таблицу, я хочу иметь таблицу сопоставления. Для этого я использую следующее.EF Code first - таблица сопоставлений многих-многих отношений с дополнительными столбцами

modelBuilder.Entity<UserGroup>() 
     .HasMany(a => a.Users) 
     .WithMany(b => b.UserGroup) 

     .Map(mc => 
     { 

      mc.ToTable("UserUserGroupMapping"); 
      mc.MapLeftKey("UserId"); 
      mc.MapRightKey("UserGroupId"); 

     }); 

Это создает таблицу с UserId и UserGroupId в виде столбцов. Однако у меня мало проблем,

Я хотел был бы иметь возможность добавить столбец Identity к этой таблице и некоторые столбцы аудита (ex: Created by, created date) к таблице. Я не знаю, как это сделать.

Может ли кто-нибудь мне помочь?

Благодаря

+1

Возможный дубликат [Создать код сначала, многие ко многим, с дополнительными полями в таблице объединений) (http://stackoverflow.com/questions/7050404/create-code-first-many-to-many-with-additional -fields-in-association-table) – jjj

+0

http://stackoverflow.com/questions/29831729/asp-net-mvc-many-to-many-relationship-using-my-own-table и http: // stackoverflow. com/questions/30577738/how-to-define-many-to-many-with-attributes-in-entity-framework – jjj

+0

или вы имеете в виду, что у вас уже есть эта таблица, и вы хотите создать для нее модель? – jjj

ответ

6

Я думаю, что это будет работать, если вы сделаете следующее:

  1. Удалить конфигурацию, которую вы показали в фрагменте кода выше
  2. Добавить таблицу сопоставления и настроить его имя таблицы для соответствия имени исходной таблицы.

    // name this whatever you want 
    class UserUserGroupMapping 
    { 
        public UserUserGroupMappingId { get; set; } 
        public int UserId { get; set; } 
        public virtual User User { get; set; } 
        public int UserGroupId { get; set; } 
        public virtual UserGroup UserGroup { get; set; } 
        // other properties 
    } 
    

    modelBuilder.Entity<UserUserGroupMapping>() 
        .HasKey(um => um.UserUserGroupMappingId) 
        .ToTable("UserUserGroupMapping"); 
    
  3. Заменить многие-ко-многим свойств коллекции от User и UserGroup и заменить его на один-ко-многим ассоциаций

    class User 
    { 
        // other properties 
        // remove this: 
        // public virtual ICollection<UserGroup> UserGroup { get; set; } 
        public virtual ICollection<UserUserGroupMapping> UserGroupMappings { get; set; } 
    } 
    
    class UserGroup 
    { 
        // other properties 
        // remove this: 
        // public virtual ICollection<User> Users { get; set; } 
        public virtual ICollection<UserUserGroupMapping> UserMappings { get; set; } 
    } 
    

    modelBuilder.Entity<UserUserGroupMapping>() 
        .HasRequired(um => um.UserGroup).WithMany(g => g.UserMappings) 
        .HasForeignKey(um => um.UserGroupId); 
    
    modelBuilder.Entity<UserUserGroupMapping>() 
        .HasRequired(um => um.User).WithMany(g => g.UserGroupMappings) 
        .HasForeignKey(um => um.UserId); 
    
  4. Используйте диспетчер пакетов до Add-Migration и удалите что-либо из миграции леса, которая может попытаться сбросить старую таблицу и создать новую таблицу. Миграции нужно будет, по крайней мере (я, возможно, отсутствует какой-то здесь):

    • DropPrimaryKey для исходных ключевых столбцов
    • AddColumn для новых столбцов (с Int(identity:true, nullable: false) для нового столбца первичного ключа)
    • AddPrimaryKey для нового ключевого столбца

Затем вы можете использовать методы, описанные в this answer для получения entiti эс.

Смежные вопросы