实体框架:由于一个或多个外键属性是非空的,因此无法更改关系。

4
我已完成以下配置。
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);
    }
}

在添加、删除和更新表时遇到错误。

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

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

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

4个回答

2

我发现了您的代码中的一个错误,这个错误可能会解决问题。事实上,当添加新对象ProductEligibiltys.Add(eligibleProduct);时,您正在执行Entry(eligibleProduct).State = EntityState.Modified;

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

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

0

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

产品和产品资格之间是一对多的关系。对于您的 eligibleProduct 实例,您将拥有一个名为 ProductId 的属性和另一个名为 Product 的属性(它是 Product 实体的一个实例)。对于该产品实例,还将有另一个名为 productID 的属性。我要求您也将数据传递给该属性。如果您的实体正确,则应该可以正常工作。

注意:如果您仍然遇到错误,则可能是您的实体或流畅 API 中出现了问题,请绘制数据库并检查是否按照您的要求获取了关系。


0
在您的流畅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);
    }
}

1
我已经传递了外键属性的数据,但是它没有起作用。现在我已经将其更改为HasOptional,但问题仍未解决。 - PRAKASH CHANDRA GUPTA
1
从HasRequired更改为HasOptional在模型创建时产生了以下错误:在关系“ProductEligibilty_MemberType”中,多重性与引用约束中的角色“ProductEligibilty_MemberType_Target”发生冲突。因为从属角色中的所有属性都是非空的,所以主要角色的多重性必须为“1”。 - PRAKASH CHANDRA GUPTA

0

尝试这种方式---

我假设Product和ProductEligibility是一对多的关系。

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);
       }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接