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的错误信息并不是很具体,这让我陷入了疯狂的追逐。

谢谢你的光临。

DbContext:使用复合键时出现依赖属性/ReferentialConstraint异常

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

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