2011-03-17 55 views
9

我刚刚安装了新的实体框架4.1 NuGet包,因此取代了EFCodeFirst包,按照NuGet入口this article of Scott HanselmanEF 4.1搞砸了。 FK命名策略是否改变?

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

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命名策略。这是所有其他的表和列中是一致的:无论FK EFCodeFirst命名AnyOldForeignKeyID EF 4.1要调用AnyOldForeignKey_ID(注意下划线)。

我不介意命名FK与下划线,但在这种情况下,它是指具有任何不必要扔掉数据库,并重新创建或重命名不必要的FK人的。

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

回答

3

遗憾的是,事情没有做它对这个版本一个是添加自定义约定的Code First的能力:

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

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

+0

谢谢,我整个那篇文章来的太...可惜,但为什么它首先改变? – 2011-03-17 21:02:25

+1

我更新了我的答案,其中包含有关如何解决问题的建议,但这不是很好,但它可能是最简单的。我不知道为什么改变了惯例。这是早期采用者的缺点之一,他们可以像这样改变你的东西。它也会影响我,因为我在我的个人网站上使用它,更糟糕的是,我写了一些自己的约定,所以我现在真的是一条小溪。 – 2011-03-17 21:04:41

+0

所以你建议sp_rename把当前的FK重命名为新约定的内容?我想它必须这样做,谢谢! – 2011-03-17 21:13:16

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,然后用流利的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")); 
    } 
} 
+0

@Andre - 我已经试过'[ForeignKey]'属性,但它给了我一个错误。这同样好,'因为我真的不想用它来解释我的代码。我专门问的是*不使用流畅API *的解决方案;) – 2011-03-22 10:41:00

+0

@Sergi:我不知道,当你尝试过,但我对你提供的模型,都做工精细测试两种实现你得到了什么错误。你有一个适合你的答案,我只是想增加两个选项来说明某人如何使用与内置约定不同的外键列。 – 2011-03-22 20:20:32

+0

@Andre - 我很感激,感谢 – 2011-03-22 20:22:48