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'

如果 MemberStateOrg 之间的关联是可选的,那么您需要在您的 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 属性 也被标记为可为空