【问题标题】:Entity Framework won't set FKs when creating a new record创建新记录时实体框架不会设置 FK
【发布时间】:2011-06-22 00:17:21
【问题描述】:

我正在尝试通过实体框架将 Line 添加到以下概念模型中的现有标题。

我已经通过 wcf 数据服务公开了这个模型。我正在尝试添加这样的记录:

SampleModelContainer context = new SampleModelContainer(new Uri("http://localhost:57588/WcfDataService1.svc"));

Line newLine = new Line();
newLine.item = 123;

// Generate new LineId
newLine.LineId = context.Lines.ToList().Last().LineId + 1;

// Grab a random header (doesn't matter right now)
newLine.Header = context.Headers.ToList().First();

context.AddToLines(newLine);            
context.SaveChanges();

这会失败,并出现一个错误,指出我的 HeaderId 不能为空。但是,这不应该由EF填写,因为我设置了导航属性吗?如果我填写HeaderId,它可以工作,但我不想每次都设置。

关于我做错了什么有什么想法吗?

编辑:添加了连接字符串

【问题讨论】:

  • 这个问题质量很差。标签提到了 WCF,但问题本身并没有任何关于 WCF 与问题相关的单一注释。此外,在一个答案下的评论是提到 WCF 数据服务,这使问题的范围完全不同——我猜你在客户端有问题,不是吗?如果您想首先获得答案,请学习如何提出问题以及如何使用正确的标签 - 我们看不到您的代码,因此我们无法推断那里发生了什么!顺便说一句:context.Lines.ToList().Last().LineId + 1 当我看到那个时我心脏病发作了。
  • @Ladislav 我在问题中说我的 EF 模型是通过 WCF 数据服务公开的。 (第 3 行)提供的所有代码都在我的客户端上。你还想看什么其他代码?除了自动生成的内容之外,我添加的内容很少。此外,这是一个简单的示例项目,足以暴露我的问题,在我的真实数据库中,我们有一组数字序列函数,它们提供一组字母数字主键,这使我现在的简单场景过于复杂。谢谢!
  • 好的,对不起。即使我读了你的问题 3 遍,我也完全错过了那部分。

标签: .net wcf entity-framework


【解决方案1】:

考虑到您的实体数据模型,这应该可以工作:

Line newLine = new Line();
newLine.Item = 123;

// Grab a random header (doesn't matter right now)
var header = context.Headers.First();
newLine.Header = header; // Establish the relationship

// Add the new line
context.Lines.AddObject(newLine);
context.SaveChanges();

【讨论】:

  • 我的 Lines 实体上没有 AddObject 方法?我正在使用 EF 4.1。可能是因为我是通过 wcf 数据服务使用它的吗?
【解决方案2】:

不是这个

newLine.Header = context.Headers.ToList().First();

这样做:

newLine.HeaderId = context.Headers.First().HeaderId;

不要尝试直接分配对象,设置适当的外键(在本例中为HeaderId)并让框架处理其余部分。

编辑

查看 BrokenGlass 的回答。

【讨论】:

  • 我知道这行得通。但是 EF 的目的不是让我不必处理 FK 吗?虽然这是一个相对简单的示例,但如果这些行也有一组项目怎么办?然后我必须创建该行,获取新创建的行的 id,然后应用该 id。我认为 EF 的重点是允许我在对象中创建集合,然后进行一次调用来创建集合?
  • @Jared 这是因为Line 对象不是代理。因此Header 属性的设置器内部没有逻辑来更新HeaderId 的值
  • @Eranga 这很有意义,但我仍然需要找出在不设置 FK 的情况下创建这些对象的正确方法。谢谢!
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多