Сначала база данных EF4 CTP5 + отношение "многие ко многим" (ошибка)
Я почти уверен, что это что-то в отношении скрытых соглашений, но я всегда получаю сообщение об ошибке при попытке сопоставить отношение "многие ко многим" с существующей базой данных. Вот самый простой пример:
[Table("ALRole", SchemaName = "AL")]
public class Role
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<User> Users { get; set; }
}
[Table("ALUser", SchemaName = "AL")]
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Role> Roles { get; set; }
}
Я получил обычные три таблицы в БД: первые две очевидны, а третья создается с помощью этого сценария:
CREATE TABLE AL.ALUsersRoles
(
RoleID int NOT NULL,
UserID int NOT NULL,
CONSTRAINT PK_ALUserRole PRIMARY KEY(RoleID, UserID),
CONSTRAINT FK_ALUserRole_RoleID FOREIGN KEY(RoleID) REFERENCES AL.ALRole(ID),
CONSTRAINT FK_ALUserRole_UserID FOREIGN KEY(UserID) REFERENCES AL.ALUser(ID)
)
Теперь я пытаюсь отобразить отношение "многие ко многим" с помощью следующего кода:
// ...I'm in the EntityTypeConfiguration-derived class (User)
HasMany(u => u.Roles)
.WithMany(r => r.Users)
.Map(m =>
{
m.MapLeftKey(u => u.ID, "UserID");
m.MapRightKey(r => r.ID, "RoleID");
ToTable("ALUsersRoles", "AL");
});
Я попробовал все возможные комбинации и варианты в этом коде, но я всегда получаю ошибку:
{"Invalid column name 'Name'.\r\nInvalid ...and so on...
Поэтому я думаю, что это должна быть таблица, созданная неправильно. Есть идеи? Заранее спасибо Андреа PS: Я сократил часть своего кода, так что может быть небольшая опечатка...
2 ответа
Ну, это работает для меня так же, как OP.
//many-to-many between *Users -> Web_User_Rol <- Web_Rol*
modelBuilder.Entity<Users>()
.HasMany(u => u.Web_Rols).WithMany(r => r.Users)
.Map(t=>t.MapLeftKey("user_id")
.MapRightKey("roleID")
.ToTable("Web_User_Rol"));
Нет ничего плохого в вашей объектной модели или в свободном API-коде. Я использовал их, и они отлично создали желаемую схему без каких-либо исключений. Я думаю, что ваша проблема связана с другим объектом (возможно, со свойством "Имя"), не связанным с тем, что вы здесь показали. Чтобы найти это, удалите (или переименуйте) свою существующую базу данных и позвольте Code First создать ее для вас, а затем сравните две базы данных и посмотрите, что отличается.