如何在Code First模型后添加外键属性?

时间:2014-05-15 11:22:33

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

鉴于模型:

Public Class Customer
    Property Id() As Guid
    Property FirstName() As String
    Property MiddleName() As String
    Property LastName() As String
    Property Addresses() As ICollection(Of Address)
End Class

Public Class Address
    Property Id() As Guid
    Property Name() As String
    Property Street() As String
    Property City() As String
    Property Zip() As String
    Public Property Customer() As Customer
End Class

实体框架6 Code First在我的表Customer_Id中创建了一个名为Addresses的列。现在,我想在我的类Customer_Id中添加一个属性Address,它代表现有的外键关系:

Public Class Address
    Property Id() As Guid
    Property Name() As String
    Property Street() As String
    Property City() As String
    Property Zip() As String
    Public Property Customer() As Customer

    //Added
    Public Property Customer_Id() As Guid

End Class

不幸的是,在InvalidOperationException创建DbContext时会产生{{1}}:

  

自创建数据库以来,支持'DataContext'上下文的模型已更改。

我尝试了不同的属性名称(有和没有下划线,不同的外壳)。但仍然没有运气。那么,在不需要迁移的情况下,随后添加这些属性的正确方法是什么?我认为这是可能的,因为模型并没有真正改变,我只是从属性的隐式声明改为显式......

更新

回复告诉我,我没有很好地解释这个问题。经过一些阅读后,我现在找到了正确的名称:我有一个应用程序,它在客户位置安装了几次(因此删除并重新创建数据库是没有选择的)。目前,它依赖于实体框架的 Independent Associations ,但我想在我的实体中也有外键(这对模型没有变化,外键已经存在,但是不存在作为我的实体中的属性,因为这当前仅依赖于IA)。如果没有EF认为我的数据库已经过时,我无法添加它。

2 个答案:

答案 0 :(得分:0)

此例外是因为您更改了模型。您必须设置迁移策略。请看:

http://msdn.microsoft.com/en-us/data/jj591621#enabling

(适用编辑)

首先,您必须删除该异常。即使您没有向数据库添加任何新列,您的模型也已更改,因为您向Address类添加了新属性。如果您检查数据库,则会在模型列中找到 dbo .__ MigrationHistory 表。该列的最后(最早)值用于检查您的模型和数据库是否兼容。我不确定,但我认为EF存储二进制序列化模型。所以解决方案是 - 重新创建数据库或添加迁移(可能是空迁移)。

(适用编辑)

当您想要设置FK时,您可以通过数据注释

非常简单地完成此操作
// c# example
public class Address
{
    ...
    public string CustomerId { get; set; }

    [ForeignKey("CustomerId")]
    public Customer Customer { get; set; }

}

或流利的api

// c# example
modelBuilder.Entity<Address>()
    .HasRequired(arg => arg.Customer)
    .WithMany()
    .HasForeignKey(arg => arg.CustomerId);

或者看看:

http://weblogs.asp.net/manavi/archive/2011/05/01/associations-in-ef-4-1-code-first-part-5-one-to-one-foreign-key-associations.aspx

http://msdn.microsoft.com/en-us/data/hh134698.aspx

答案 1 :(得分:0)

对我来说有两种方式:

  • drop table __MigrationHistory:即运行新模型,但忘记迁移功能
  • 通过更改应用程序的连接字符串来创建新的数据库。用新创建的db
  • 的__MigrationHistory替换旧的__MigrationHistory

从未测试过第二种解决方案,但它应该有效。

使用任何解决方案之前: 备份你的数据库。

在使用第一个解决方案之前:您确定永远不会需要迁移功能吗?