9

我刚刚安装了新的 Entity Framework 4.1 NuGet 包,因此EFCodeFirst根据 NuGet 指令 Scott Hanselman 的这篇文章替换了该包。

现在,想象以下模型:

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名为UserUserName.

安装新版本并运行后,出现以下错误:

Invalid column name 'User_UserName'

这当然意味着新版本有不同的 FK 命名策略。这在所有其他表和列中是一致的:任何名为AnyOldForeignKeyIDEF 4.1 的 FK EFCodeFirst 想要调用AnyOldForeignKey_ID(注意下划线)。

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

有谁知道为什么 FK 命名约定发生了变化,以及是否可以在不使用 Fluent API 的情况下对其进行配置?

4

2 回答 2

3

不幸的是,在此版本中没有出现的一件事是能够在 Code First 中添加自定义约定:

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

如果您不想使用 fluent API 来配置列名(我不怪您),那么最直接的方法可能是使用sp_rename

于 2011-03-17T21:00:41.197 回答
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"));
  }
}
于 2011-03-21T23:29:42.257 回答