【问题标题】:Entity Framework 4.4 SaveChanges Exclude Related EntityEntity Framework 4.4 SaveChanges 排除相关实体
【发布时间】:2014-07-22 19:06:18
【问题描述】:

我将 EntityFramework.dll 4.4 版与 .NET 4.0 一起使用。我有一个实体,其中包含对另一个实体的引用,如下所示:

[Table("Bar")]
public class Bar
{
  public string Id { get; set; }
  public Foo Foo { get; set; }
  [ForeignKey("Foo")]
  public string FooId {get; set; }
}

当我想在数据库中添加一个新的“Bar”记录时,EntityFramework 会尝试添加一个“Foo”的实例,但我不希望它这样做。 有没有办法告诉 EF 在创建 Bar 时忽略 Foo 实体?想在 Foo 上设置 [NotMapped] 因为它确实需要映射 -只是我不想保存它。所以我希望以下工作:

public void CreateBar(Bar b)
{
   _barContext.Bars.Add(b);
   // This function doesn't exist, but I would like it to exist
   _barContext.Exclude("Foo");
   _barContext.SaveChanges();
}

【问题讨论】:

  • 不确定答案,但首先您需要将 FooId 设为可为空。
  • 你怎么知道'EntityFramework 也试图添加一个“Foo”'的实例
  • @haim770,我正在使用 EF Profiler,并且在 Foo 表中也遇到了唯一键违规。因为它试图插入一个已经存在的 Foo。
  • 想一想,你确定这两个实体是正确的方法吗? IE 如果一个 Foo 总是有一个 Bar,但一个 Bar 可能有也可能没有 Foo,则外键应该是 Foo 实体中的 BarId,Bar 内有一个虚拟 Foo。
  • 保存对 foo 的引用将 foo 设置为 null 保存 bar 并将 foo 属性重置为之前保存的引用,或者您可以手动将实体状态重置为未更改/分离。

标签: c# entity-framework


【解决方案1】:

【讨论】:

  • 我知道这可行,但我要求尽可能不涉及使用 NotMapped 的解决方案。我仍然需要为 Bar 实体的其他用途映射 Foo 实体。不过感谢您的回复。
  • 您有时无法按要求拥有它,有时则不能。不是通过使用一个模型和一个数据库。数据库中的属性将设置为不可为空,并设置参照完整性。唯一的办法就是将其标记为 Nullable,并确保在需要时设置属性。
  • 我最初在 Bar 的“Foo”属性上拥有 ForeignKey 属性。但是当我删除该属性并将其移至 Foo 实体时,我能够将“NotMapped”属性添加到 Bar 的“Foo”属性中,现在一切正常。感谢您的帮助!
猜你喜欢
  • 2014-11-18
  • 2018-02-27
  • 1970-01-01
  • 2016-10-10
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多