Entity Framework 无法更改关系,因为一个或多个外键属性不可为空

Entity Framework The relationship could not be changed because one or more of the foreign-key properties is non-nullable

我做了如下配置

public class ProductEligibiltyConfiguration : EntityTypeConfiguration<ProductEligibilty>
{
    public ProductEligibiltyConfiguration()
    {
        HasKey(t => t.Id).ToTable("ecom_ProductEligibilty");
        HasRequired(a => a.Product)
            .WithMany(t => t.MeetingProductEligibilty)
            .HasForeignKey(k => k.ProductId)
            .WillCascadeOnDelete(false);
        HasRequired(t => t.MemberType).WithMany().HasForeignKey(k => k.MemberTypeId).WillCascadeOnDelete(false);
    }
}

但是在添加、删除、更新 table 时出现错误。

使用以下代码进行更新,同时我也为它们设置了所有引用和对象。

foreach (var eligibleProduct in productEligibiltyes)
        {
          ProductEligibiltys.Attach(eligibleProduct);
          Entry(eligibleProduct).State = EntityState.Modified;
          ProductEligibiltys.Add(eligibleProduct);
       }

出现错误: 操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键 属性 将设置为空值。如果外键不支持空值,则必须定义新关系,外键属性必须分配另一个非空值,或者必须删除不相关的对象。

在你的流利 API 中,你已经为两个外键添加了配置 HasRequired(),这两个外键需要非空数据,但是根据 eligibleProduct 实例中的错误说明外键 属性 不应该有数据。应该是错误。

您可以传递外键 属性 的数据,或者您可以将 HasRequired() 更改为 HasOptional(),如下所示。

public class ProductEligibiltyConfiguration : EntityTypeConfiguration<ProductEligibilty>
{
    public ProductEligibiltyConfiguration()
    {
        HasKey(t => t.Id).ToTable("ecom_ProductEligibilty");
        HasOptional(a => a.Product)
            .WithMany(t => t.MeetingProductEligibilty)
            .HasForeignKey(k => k.ProductId)
            .WillCascadeOnDelete(false);
        HasOptional(t => t.MemberType).WithMany().HasForeignKey(k => k.MemberTypeId).WillCascadeOnDelete(false);
    }
}

我仍然不太了解您的实体。让我假设如下

Product 和 ProductEligiblity 在一对多 relationship.For 您的 eligibleProduct 实例中,您将有一个 属性 调用 ProductId,另一个 属性 调用 Product(这是 Product 实体的一个实例) .对于该产品实例,将有另一个 属性 调用 productID.I 我要求您将数据传递给它,因为如果您的实体是正确的,well.This 应该可以工作。

注意:如果您仍然遇到错误,您的实体或某处有问题 api,您可以绘制数据库图表并检查是否根据您的要求获得关系

试试这个方法---

因为我假设 Product 和 ProductEligiblity 是一对多关系。

foreach (var eligibleProduct in productEligibiltyes)
        { 
          Products products= new Products();
          products.ProductId=eligibleProduct.ProductId;
          products.ProductEligiblity.Add(eligibleProduct);
          Product.Attach(products);
          Entry(products).State = EntityState.Modified;
          Product.Add(products);
       }

我注意到您的代码中有一个错误,可能会解决这个问题。其实你在做 Entry(eligibleProduct).State = EntityState.Modified; 添加新对象对象 ProductEligibiltys.Add(eligibleProduct);

您应该删除此行。最终代码将如下所示:

foreach (var eligibleProduct in productEligibiltyes)
   {
      ProductEligibiltys.Attach(eligibleProduct);
      ProductEligibiltys.Add(eligibleProduct);
   }