EF7将子对象设置为null问题

时间:2016-06-07 01:34:13

标签: 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.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中将null设置为Org字段。

mwmbwe.State = new MemberState()
{
    Id = Guid.NewGuid(),
    ....
    Org = null
 };          
 _provider.SaveChanges();  

将更改保存到数据库时发生异常。 EF尝试使用null PK插入相关的Org项目。 有什么办法可以解决这个问题吗?

还尝试通过直接ExecuteSqlCommand来解决这个问题,而不是从EF提供程序中获取新的MemberState,但它也引发了异常: “对象引用未设置为对象的实例。”

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

2 个答案:

答案 0 :(得分:0)

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

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

因此,EF Core将允许您在运行时不使用Org保存MemberState。

答案 1 :(得分:0)

魔鬼详情)

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属性也被标记为可以为空