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);
}
我做了如下配置
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);
}