我刚刚安装了新的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的情况下配置?
答案 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"));
}
}