C# 实体框架关系无法更改,因为一个或多个外键属性不可为空

C# 实体框架关系无法更改,因为一个或多个外键属性不可为空,c#,database,entity-framework,insert-update,fluent,C#,Database,Entity Framework,Insert Update,Fluent,我已经完成了以下配置 public class ProductEligibiltyConfiguration : EntityTypeConfiguration<ProductEligibilty> { public ProductEligibiltyConfiguration() { HasKey(t => t.Id).ToTable("ecom_ProductEligibilty"); HasRequired(a =>

我已经完成了以下配置

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);
    }
}
获取错误:
操作失败:无法更改关系,因为一个或多个外键属性不可为null。对关系进行更改时,相关外键属性设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

在fluent API中,您为两个外键添加了配置,这两个外键都需要外键的非空数据,但是根据
eligibleProduct
实例中的错误说明,外键属性不应该包含数据。这应该是错误

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

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);
    }
}
公共类ProductEligibiltyConfiguration:EntityTypeConfiguration
{
公共产品可授权配置()
{
HasKey(t=>t.Id).ToTable(“ecom_productilibility”);
has可选(a=>a.Product)
.WithMany(t=>t.MeetingProductilibility)
.HasForeignKey(k=>k.ProductId)
.WillCascadeOnDelete(假);
HasOptional(t=>t.MemberType).WithMany().HasForeignKey(k=>k.MemberTypeId).WillCascadeOnDelete(false);
}
}

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

一对多关系中的Product和ProductEligibility。对于eligibleProduct实例,一个属性调用ProductId,另一个属性调用Product(它是Product实体的实例)。对于该产品Instance,将有另一个属性调用productID。我要求您也将数据传递给该属性。如果您的实体正确,这应该可以工作

注意:如果您的实体或fluent api中的某个地方仍然出现错误,您可以绘制数据库图并检查您是否按照您的要求获得了关系---

我假设产品和可生产性是一对多的关系

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

我注意到你的代码中有一个bug,它可能会修复这个问题。实际上您正在执行
Entry(eligibleProduct).State=EntityState.Modified添加新对象时对象
ProductEligibiltys.Add(eligibleProduct)

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

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

我已经传递了外键属性的数据,但这不起作用。现在,我已将更改为HasOptional,但即使是现在,问题仍然没有得到解决。在创建模型时,将HasRequired更改为HasOptional会产生以下错误:多重性与关系“ProducteLibility\u MemberType”中角色“ProducteLibility\u MemberType\u Target”中的引用约束冲突。因为从属角色中的所有属性都不可为null,所以主体角色的多重性必须为“1”。
foreach (var eligibleProduct in productEligibiltyes)
   {
      ProductEligibiltys.Attach(eligibleProduct);
      ProductEligibiltys.Add(eligibleProduct);
   }