我很确定这是关于隐藏约定的东西,但是在尝试将多对多关系映射到现有数据库时,我总是遇到错误。 这是最简单的例子:
[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; }
}
我在db中得到了通常的三个表:前两个是显而易见的,第三个是用这个脚本创建的:
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...
所以我认为它必须是未正确创建的表。 有任何想法吗? 提前致谢 安德里亚 P.S。:我删除了我的一些代码,所以也许可能会有一些小错误......
答案 0 :(得分:1)
嗯,这对我来说和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"));
答案 1 :(得分:0)
您的对象模型或流畅的API代码没有任何问题。我已经使用过它们,它们完美地创建了所需的模式,没有任何异常。我认为您的问题来自另一个实体(可能是一个具有“Name”属性的实体)与您在此处显示的内容无关。要查找,删除(或重命名)现有数据库,让Code First为您创建一个,然后比较2个数据库,看看有什么不同。