EF7 将子对象设置为空问题
EF7 setting child object to null issue
我在我的项目中使用 EF7 rc2。
有两个相关类
public sealed class Member
{
......
public MemberState State { get; set; }
}
public sealed class MemberState
{
public Guid Id { get; set; }
public Org Org { get; set; }
....
}
和 EF 配置:
modelBuilder.Entity<MemberState>(entity =>
{
entity.ToTable("State");
entity.HasKey(e => e.Id);
entity.Property<Guid>("Idf_Org");
entity.HasOne(e => e.Org).WithMany().HasForeignKey("Idf_Org");
.....
});
modelBuilder.Entity<Member>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property<Guid>("Idf_State");
entity.HasOne(member => member.State).WithMany().HasForeignKey("Idf_State");
});
所以,有一段时间我想在 MembersState 中将 Org 字段设置为 null。
mwmbwe.State = new MemberState()
{
Id = Guid.NewGuid(),
....
Org = null
};
_provider.SaveChanges();
将更改保存到数据库时出现异常。 EF 尝试插入具有空 PK 的相关组织项。 有什么办法可以避免这种情况吗?
还尝试通过直接 ExecuteSqlCommand 解决此问题,而不是从 EF 提供程序获取新的 MemberState,但它也会引发异常:
"Object reference not set to an instance of an object."
在数据库字段中,包含 Idf_Org 标记为 'Allow null'
如果 MemberState 和 Org 之间的关联是可选的,那么您需要在您的 API 中指定它:
entity.HasOne(e => e.Org)
.WithMany()
.HasForeignKey("Idf_Org")
.IsRequired(false);
因此,EF Core 将允许您在运行时保存没有 Org 的 MemberState。
魔鬼在细节中)
Mortezas 的回答非常有帮助,但在应用它之后我遇到了这个问题:
Microsoft.EntityFrameworkCore.dll 中发生类型 'System.InvalidOperationException' 的异常,但未在用户代码中处理附加信息:实体类型 'MemberState' 上的外键 {'Idf_Org'} 不能被标记为可选,因为它不包含任何可空类型的 属性。任何外键都可以标记为必需,但只有具有至少一个 属性 可空类型且不属于主键的外键才能标记为可选。
所以,真正的决定是
entity.Property<Guid?>("Idf_Org");
entity.HasOne(e => e.Org).WithMany().HasForeignKey("Idf_Org").IsRequired(false);
它仅适用于 wen shadow 属性 也被标记为可为空
我在我的项目中使用 EF7 rc2。 有两个相关类
public sealed class Member
{
......
public MemberState State { get; set; }
}
public sealed class MemberState
{
public Guid Id { get; set; }
public Org Org { get; set; }
....
}
和 EF 配置:
modelBuilder.Entity<MemberState>(entity =>
{
entity.ToTable("State");
entity.HasKey(e => e.Id);
entity.Property<Guid>("Idf_Org");
entity.HasOne(e => e.Org).WithMany().HasForeignKey("Idf_Org");
.....
});
modelBuilder.Entity<Member>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property<Guid>("Idf_State");
entity.HasOne(member => member.State).WithMany().HasForeignKey("Idf_State");
});
所以,有一段时间我想在 MembersState 中将 Org 字段设置为 null。
mwmbwe.State = new MemberState()
{
Id = Guid.NewGuid(),
....
Org = null
};
_provider.SaveChanges();
将更改保存到数据库时出现异常。 EF 尝试插入具有空 PK 的相关组织项。 有什么办法可以避免这种情况吗?
还尝试通过直接 ExecuteSqlCommand 解决此问题,而不是从 EF 提供程序获取新的 MemberState,但它也会引发异常: "Object reference not set to an instance of an object."
在数据库字段中,包含 Idf_Org 标记为 'Allow null'
如果 MemberState 和 Org 之间的关联是可选的,那么您需要在您的 API 中指定它:
entity.HasOne(e => e.Org)
.WithMany()
.HasForeignKey("Idf_Org")
.IsRequired(false);
因此,EF Core 将允许您在运行时保存没有 Org 的 MemberState。
魔鬼在细节中)
Mortezas 的回答非常有帮助,但在应用它之后我遇到了这个问题: Microsoft.EntityFrameworkCore.dll 中发生类型 'System.InvalidOperationException' 的异常,但未在用户代码中处理附加信息:实体类型 'MemberState' 上的外键 {'Idf_Org'} 不能被标记为可选,因为它不包含任何可空类型的 属性。任何外键都可以标记为必需,但只有具有至少一个 属性 可空类型且不属于主键的外键才能标记为可选。
所以,真正的决定是
entity.Property<Guid?>("Idf_Org");
entity.HasOne(e => e.Org).WithMany().HasForeignKey("Idf_Org").IsRequired(false);
它仅适用于 wen shadow 属性 也被标记为可为空