我正在通过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的错误消息并不是非常具体,并引导我进行疯狂的追逐。
感谢您的光临。
答案 0 :(得分:1)
此错误表示某些OrderId
属性(例外应包含有关发生此情况的实体或关系的信息)被映射为存储生成=它已将DatabaseGeneratedOption
设置为Identity
或Computed
。如果问题与OrderAddress
实体有关,请尝试将其添加到映射定义中:
modelBuilder.Entity<OrderAddress>()
.Property(x => x.OrderId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);