场合
我已经广泛地搜索了这个答案(在SO和其他地方),我知道在同一个标题上有很多关于SO的问题。
我有一个表格映射和模型正在运行。然后更改了模式(我没有直接控制数据库),因此引入了新的主键,旧的主键成为另一个表的外键。 我认为这是问题的核心,因为其他实体似乎没有问题
映射
这是映射我的实体的方法(从OnModelCreating调用)
private static void MapThing(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Thing>().ToTable("ThingTable");
modelBuilder.Entity<Thing>().HasKey(p => p.Id);
modelBuilder.Entity<Thing>().Property(p => p.Id).HasColumnName("NewId");
modelBuilder.Entity<Thing>().Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Thing>().Property(p => p.FileName).HasColumnName("ColumnWhosNameChanged");
modelBuilder.Entity<Thing>().HasRequired(p => p.MetaDataOnThing);
}
表的旧PK现在被定义为模型上的属性,它与列的名称相同(原因在上面的映射中未定义)。
模型
这是模型(我已经应用了名称,我希望能更清楚地说明发生了什么变化):
public class Thing
{
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
//This used to be the PK, its names (Property AND Column) have not changed
public int OldId { get; set; }
//The column name for FileName changed to something else
public string FileName { get; set; }
//Unchanged
public byte[] Document { get; set; }
public string ContentType { get; set; }
//Navigation Property
public ThingMetaData MetaDataOnThing { get; set; }
}
整合测试
我删除了很多结构,希望说清楚......测试非常简单
[TestMethod]
public void ThenThingWillBePersisted()
{
var thing = new Thing()
{
OldId = metaDataObject.Id,
Document = new byte[] { 42 },
FileName = "foo.jpg",
ContentType = "image/jpeg"
};
context.Things.Add(thing);
context.SaveChanges();
}
此测试产生错误&#34; ReferentialConstraint中的依赖属性映射到存储生成的列。柱:&#39; NEWID&#39;&#34;并且内部异常指向NewId作为问题。它在SaveChanges()调用上执行此操作。
不可否认,我对nHibernate的经验比对Entity Framework的经验要多,但我很确定我的映射和模型设置正确。
有没有人见过这个问题,你是如何解决的?