" ReferentialConstraint中的依赖属性映射到存储生成的列"随着Id改变

时间:2014-04-24 21:56:16

标签: entity-framework entity-framework-4 entity-framework-5

场合

我已经广泛地搜索了这个答案(在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的经验要多,但我很确定我的映射和模型设置正确。

有没有人见过这个问题,你是如何解决的?

0 个答案:

没有答案