C# EF7将子对象设置为空问题

C# EF7将子对象设置为空问题,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我正在我的项目中使用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

我正在我的项目中使用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");
});
将更改保存到数据库时发生异常。EF正在尝试插入主键为空的相关组织项目有什么办法可以避免这种情况吗?

还尝试通过direct ExecuteSqlCommand解决此问题,而不是从EF provider获取新的MemberState,但它也会引发异常: “对象引用未设置为对象的实例。”


在数据库字段中,包含标记为“允许null”的Idf_Org

如果MemberState和Org之间的关联是可选的,则需要在fluent API中指定:

entity.HasOne(e => e.Org)
      .WithMany()
      .HasForeignKey("Idf_Org")
      .IsRequired(false);

因此,EF Core将允许您在运行时保存不带组织的MemberState。

如果MemberState和组织之间的关联是可选的,则您需要在fluent API中指定:

entity.HasOne(e => e.Org)
      .WithMany()
      .HasForeignKey("Idf_Org")
      .IsRequired(false);
因此,EF Core将允许您在运行时保存不带组织的MemberState。

详细信息)

Mortezas的回答非常有用,但在应用它之后,我得到了以下解释: Microsoft.EntityFrameworkCore.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理其他信息:实体类型“MemberState”上的外键{Idf_Org}无法标记为可选,因为它不包含任何可为空类型的属性。可以根据需要标记任何外键,但只有至少具有一个可为null类型属性且不属于主键的外键才能标记为可选

所以,真正的决定是

entity.Property<Guid?>("Idf_Org");
entity.HasOne(e => e.Org).WithMany().HasForeignKey("Idf_Org").IsRequired(false);
entity.Property(“Idf_Org”);
entity.HasOne(e=>e.Org).WithMany().HasForeignKey(“Idf_Org”).IsRequired(false);
它只起作用(阴影属性也被标记为可为空

魔鬼在细节中)

Mortezas的回答非常有用,但在应用它之后,我得到了以下解释: Microsoft.EntityFrameworkCore.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理其他信息:实体类型“MemberState”上的外键{Idf_Org}无法标记为可选,因为它不包含任何可为空类型的属性。可以根据需要标记任何外键,但只有至少具有一个可为null类型属性且不属于主键的外键才能标记为可选

所以,真正的决定是

entity.Property<Guid?>("Idf_Org");
entity.HasOne(e => e.Org).WithMany().HasForeignKey("Idf_Org").IsRequired(false);
entity.Property(“Idf_Org”);
entity.HasOne(e=>e.Org).WithMany().HasForeignKey(“Idf_Org”).IsRequired(false);

它只起作用。实际上,我已经试过了,这似乎是正确的决定,但重新配置后,我的ASP.NET core 1.0应用程序无法启动。这很奇怪-没有异常,或者输出警告是FireDup输出包含以下内容:在Microsoft.EntityFrameworkCore.dll中引发异常:“System.InvalidOperationException”。实际上,我已经尝试过这一点,这似乎是正确的决定,但重新配置后,我的ASP.NET core 1.0应用程序无法启动。这很奇怪-没有异常或输出警告是FireDup输出包含以下内容:抛出异常:Microsoft.EntityFrameworkCore.dll中的“System.InvalidOperationException”正确,另一个(更好)方法是在映射到Idf_Org的MemberState对象上具有可为Null的FK属性,而不是对其进行阴影处理。这是正确的,另一种(更好)方法是在映射到Idf_Org的MemberState对象上具有可为Null的FK属性,而不是对其进行阴影处理。