Почему для моих сущностей, которые участвуют в отношениях M: M, создаются дополнительные столбцы? - PullRequest
0 голосов
/ 21 января 2012

У меня есть следующие объекты:

public class User
{
    public virtual ICollection<Role> Roles { get; set; }
}

public class Role
{
    public virtual ICollection<User> Users { get; set; }
}

И следующий код в MyContext.OnModelCreating:

mb.Conventions.Remove<OneToManyCascadeDeleteConvention>();
mb.Entity<T>().ToTable("Users", "myschema");
mb.Entity<T>().ToTable("Roles", "myschema");
mb.Entity<User>().HasMany(x => x.Roles).WithMany().Map(a => a.ToTable("UsersRoles", "myschema"));
mb.Entity<Role>().HasMany(x => x.Permissions).WithMany().Map(a => a.ToTable("RolesPermissions", "myschema"));

Все остальные соглашения являются стандартными. Во время инициализации базы данных таблица Users имеет столбец внешнего ключа Role_Id . Это не имеет смысла . Таблицы Users , Roles и UsersRoles являются правильными.

При использовании EF User.Role_Id всегда равен NULL , и транзакции завершаются успешно, а UsersRoles обновляется, как ожидается. Если я удалю столбец, EF не будет жаловаться на это.

Почему EF делает это и как я могу это исправить - предпочтительно удаляя ненужный столбец?

1 Ответ

0 голосов
/ 21 января 2012

Это отображение неверно:

mb.Entity<User>()
    .HasMany(x => x.Roles)
    .WithMany()
    .Map(a => a.ToTable("UsersRoles", "myschema"));

Это должно быть:

mb.Entity<User>()
    .HasMany(x => x.Roles)
    .WithMany(x => x.Users)
    .Map(a => a.ToTable("UsersRoles", "myschema"));

Ваше первое отображение говорит EF, что у вас есть отношение «многие ко многим» без открытого свойства навигации вRole.Поэтому EF предполагает, что Role.Users принадлежит другому - по умолчанию отношение один-ко-многим - между User и Role, которое имеет конец в User, также не отображаемом в модели.Столбец FK, который вы видите, принадлежит этой второй ассоциации.

...