鉴于模型:
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认为我的数据库已经过时,我无法添加它。
答案 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);
或者看看:
答案 1 :(得分:0)
对我来说有两种方式:
drop table __MigrationHistory
:即运行新模型,但忘记迁移功能从未测试过第二种解决方案,但它应该有效。
使用任何解决方案之前: 备份你的数据库。
在使用第一个解决方案之前:您确定永远不会需要迁移功能吗?