EF:使用延迟加载的必需属性时,验证失败怎么解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (29)

鉴于这个非常简单的模型:

public class MyContext : BaseContext
{
    public DbSet<Foo> Foos { get; set; }
    public DbSet<Bar> Bars { get; set; }
}

public class Foo
{
    public int Id { get; set; }
    public int Data { get; set; }
    [Required]
    public virtual Bar Bar { get; set; }
}

public class Bar
{
    public int Id { get; set; }
}

以下程序失败:

object id;
using (var context = new MyContext())
{
    var foo = new Foo { Bar = new Bar() };
    context.Foos.Add(foo);
    context.SaveChanges();
    id = foo.Id;
}
using (var context = new MyContext())
{
    var foo = context.Foos.Find(id);
    foo.Data = 2;
    context.SaveChanges(); //Crash here
}

但是,如果我Bar通过在之前添加以下行来强制加载属性SaveChanges

var bar = foo.Bar;

一切正常。

这真的是预期的行为?是否有任何解决方法?

提问于
用户回答回答于

我认为这是一个非常糟糕的代理实现。虽然不必要地遍历对象图和检索加载的属性,你不需要去代理一个包装器来验证它的存在。再想一想,我不知道你为什么要遍历对象图,当然ORM的更改跟踪器知道哪些对象需要验证。

我不知道为什么会存在这个问题,但是如果我使用的是NHibernate,我肯定不会有这个问题。

我所做的是在EntityTypeConfiguration类中定义关系的所需性质,并删除所需的属性。这应该能让它正常工作。这意味着你将不会验证关系,但它将失败的更新。不是一个理想的结果。

用户回答回答于

首先给出一点解释:

如果你有一个属性FK,你也可以在模型中使用相应的FK字段,因此,如果我们只需要FK,而不是实际的“Bar”,则不需要它转到数据库:

[ForeignKey("BarId")]
public virtual Bar Bar { get; set; }
public int BarId { get; set; }

你可以根据需要设置Barid属性,但不能标记Bar本身:

[ForeignKey("BarId")]
public virtual Bar Bar { get; set; }
[Required] //this makes the trick
public int BarId { get; set; }

所属标签

可能回答问题的人

  • 人生的旅途

    10 粉丝484 提问6 回答
  • 不吃貓的鱼oo

    5 粉丝466 提问6 回答
  • 富有想象力的人

    4 粉丝0 提问5 回答
  • Richel

    8 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励