我正在使用CTP5并切换到RC1。由于没有更改EntityTypeConfiguration,EF现在正试图通过错误的列名查找内容。它使用的是单数而不是复数的列名,我无法弄清楚它在哪里得到这个想法。
示例:多对多
//User.Roles
//Role.Users
//User EntityTypeConfiguration
this.HasKey(x => x.Id);
this.HasMany(x => x.Roles)
.WithMany().Map(m => {
m.MapLeftKey("Users_Id");
m.MapRightKey("Roles_Id");
m.ToTable("UserRoleLinks");
});
然后我收到错误:
无效的列名称'User_Id'。
它在哪里获得“User_Id”?表Id是“Id”;连接表明确表示为“Users_Id”CTP5和RC1之间的变化会导致这种情况发生什么变化?
更新:
我正在使用“modelBuilder.Conventions.Remove< IncludeMetadataConvention>()”是不再支持的?这可能是问题吗?我不确定现在的默认行为是什么。
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
modelBuilder.Configurations.Add(new UserConfig());
}
答案 0 :(得分:4)
我弄清楚我做错了什么。简短的回答是我需要定义多对多关系的两个方面,因为每个类都参与一个互惠集合(User.Roles和Role.Users)。显然,CTP5没有必要这样做。
请参阅:Many to Many mapping not working - EF 4.1 RC
坚持我的例子,这是正确的语法。
this.HasMany(x => x.Roles)
.WithMany(r => r.Users).Map(m => {
m.MapLeftKey("Users_Id");
m.MapRightKey("Roles_Id");
m.ToTable("UserRoleLinks");
});
有一些陷阱困扰了我的简单解决方案。
1)只定义一次关系。我在不同的EntityTypeConfiguration&lt; T&gt;中从两个角度定义了多对多关系。类,这是不必要的,并带来自己的错误。
2)不要混淆用于MapLeftKey和MapRightKey的字段。订单很直观,但我猜它很容易通过复制/粘贴和什么不混合。
答案 1 :(得分:0)
外键更改命名约定在EF 4.1 RC
。
问题基本上是EF现在希望FK被称为User_ID
(单数),并且RC不提供配置自定义约定的能力。
如果EF为您重新创建数据库,只需将映射更改为User_Id
即可。如果您遇到生产数据库,我建议使用sp_rename重命名数据库中的外键。
这个答案(来自我的一个问题,见下文)在生产数据库上无痛无缝地为我工作。