EF 4.1搞砸了。 FK命名策略有变化吗?

时间:2011-03-17 19:56:24

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

我刚刚安装了新的Entity Framework 4.1 NuGet包,因此根据NuGet intructions this article of Scott Hanselman替换了EFCodeFirst包。

现在,想象一下以下模型:

public class User
{
    [Key]
    public string UserName { get; set; }
    // whatever
}

public class UserThing
{
    public int ID { get; set; }
    public virtual User User { get; set; }
    // whatever
}

最后一个EFCodeFirst版本在名为UserThing的{​​{1}}表中生成了一个外键。

安装新版本并运行后,我收到以下错误:

UserUserName

这当然意味着新版本具有不同的FK命名策略。这在所有其他表和列中是一致的:无论名为Invalid column name 'User_UserName' EF 4.1的FK EFCodeFirst想要调用AnyOldForeignKeyID(注意下划线)。

我不介意用下划线命名FK,但在这种情况下,它意味着必须不必要地丢弃数据库并重新创建它或不必要地重命名al FK。

有没有人知道为什么FK命名约定已经改变,以及是否可以在不使用Fluent API的情况下配置

2 个答案:

答案 0 :(得分:3)

不幸的是,本次发布的其中一个功能是能够在Code First中添加自定义约定:

http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-release-candidate-available.aspx

如果你不想使用流畅的API来配置列名(我不怪你),那么最直接的方法就是使用sp_rename

答案 1 :(得分:3)

为什么不这样做?

  public class User
  {
    [Key]
    public string UserName { get; set; }
    // whatever
  }

  public class UserThing
  {
    public int ID { get; set; }
    public string UserUserName { get; set; }
    [ForeignKey("UserUserName")]
    public virtual User User { get; set; }
    // whatever
  }

或者,如果您不想将UserUserName属性添加到UserThing,那么请使用fluent API,如下所示:

// class User same as in question
// class UserThing same as in question

public class MyContext : DbContext
{
  public MyContext()
    : base("MyCeDb") { }
  public DbSet<User> Users { get; set; }
  public DbSet<UserThing> UserThings { get; set; }

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    modelBuilder.Entity<UserThing>()
      .HasOptional(ut => ut.User)    // See if HasRequired fits your model better
      .WithMany().Map(u => u.MapKey("UserUserName"));
  }
}