DbContext:Dependent属性/ ReferentialConstraint使用Composite Key时的异常

时间:2012-02-29 23:35:15

标签: c# entity-framework ef-code-first composite-key

我正在通过DbContext和现有数据库使用EntityFramework。

当我向我的上下文添加一个Order实体并调用SaveChanges()时,我遇到了以下异常:“ReferentialConstraint中的依赖属性映射到存储生成的列.Column:OrderId”。

我相信这是因为我的OrderAddress表上的复合键而发生的,我希望有一种解决方法...我不想在该表上创建一个IDENTITY。

以下是我的实体,简化......

// OrderId is an IDENTITY PK
public class Order
{
     public int OrderId { get; set; }
     public IList<OrderAddress> Addresses { get; set; }
     public int Total { get; set; }
}

// PK on this table is composite key of OrderId and OrderAddressTypeId
public class OrderAddress
{
     public int OrderId { get; set; }
     public int OrderAddressTypeId { get; set; }
     public string Address { get; set; }
}

这是我的上下文,简化......

public class StoreContext : DbContext
{
     DbSet<Order> Orders { get; set; }
     DbSet<OrderAddress> OrderAddresses { get; set; }

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
          // Set the Identity for Order
          modelBuilder.Entity<Order>()
               .Property(x => x.OrderId)
               .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

          // Set composite key for Order Address
          modelBuilder.Entity<OrderAddress>()
               .HasKey(x => new { x.OrderId, x.OrderAddressTypeId });
     }
}

注意:我已经查看了类似的其他SO问题,并尝试了列出的解决方案但没有成功。我已经验证我的外键是在数据库中正确设置的。我的问题有什么不同,就是使用复合键。

提前感谢您的帮助。

更新

这最终与复合键完全无关。我的Context OnModelCreating方法中还有一行需要一个子实体OrderSummary,它基于我的数据库中的View。这条线看起来像这样......

modelBuilder.Entity<OrderSummary>().HasRequired(x => x.Order).WithRequiredPrincipal(x => x.OrderSummary);

我从未打算让OrderSummary成为Order的必需负责人。将其更改为以下问题解决了问题...

modelBuilder.Entity<OrderSummary>().HasRequired(x => x.Order);

不幸的是,来自EF的错误消息并不是非常具体,并引导我进行疯狂的追逐。

感谢您的光临。

1 个答案:

答案 0 :(得分:1)

此错误表示某些OrderId属性(例外应包含有关发生此情况的实体或关系的信息)被映射为存储生成=它已将DatabaseGeneratedOption设置为IdentityComputed。如果问题与OrderAddress实体有关,请尝试将其添加到映射定义中:

modelBuilder.Entity<OrderAddress>()
            .Property(x => x.OrderId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);