如何让EF 4.1 RC代码首先使用正确的外键?

时间:2011-04-05 19:01:55

标签: many-to-many ef-code-first entity-framework-4.1

我正在使用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()); 
}

2 个答案:

答案 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重命名数据库中的外键。

这个答案(来自我的一个问题,见下文)在生产数据库上无痛无缝地为我工作。


有用的参考资料