DbContext:使用复合键时出现依赖属性/ReferentialConstraint异常
本文关键字:依赖 属性 异常 ReferentialConstraint 复合 DbContext | 更新日期: 2023-09-27 18:26:07
我通过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的错误信息并不是很具体,这让我陷入了疯狂的追逐。
谢谢你的光临。
此错误表示某些OrderId
属性(异常应包含有关发生此情况的实体或关系的信息)被映射为存储生成=它将DatabaseGeneratedOption
设置为Identity
或Computed
。如果问题与OrderAddress
实体有关,请尝试将其添加到映射定义中:
modelBuilder.Entity<OrderAddress>()
.Property(x => x.OrderId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);