如何在EF中设置外键值?

时间:2012-07-27 17:57:19

标签: c# .net entity-framework

我有以下代码:

BudgetLineItem actualLi = new BudgetLineItem();
actualLi.YearId = be.lu_FiscalYear.Where(t => t.Year == actualYear).Select(t => t.Id).First();
actualLi.TypeId = be.lu_Type.Where(t => t.Name == "Actual").Select(t => t.id).First();
actualLi.DeptId = be.lu_Department.Where(t => t.Name == DeptName).Select(t => t.ID).First();
actualLi.LineItemId = be.lu_LineItem.Where(t => t.Name == revenueType).Select(t => t.id).First();
actualLi.Amount = actualAmount;
be.AddToBudgetLineItems(actualLi);
be.SaveChanges();

它创建了一个对象,其中包含我想要在数据库中插入的内容。但是当我尝试保存此记录时,我收到错误:

  

'xxxx'中的实体参与'xxxx'关系。 0相关   'xxxx'被发现了。预计1''。

我的BudgetLineItem表与名为lu_Department的表有外键关系,这是错误引用的。

我发现this question似乎提供了解决方案,但对于我想要做的事情来说,它似乎过于复杂。

我最好选择我链接的问题中提供的解决方案吗?如果是这样,为什么EF会让这么复杂?

1 个答案:

答案 0 :(得分:0)

BudgetLineItem actualLi = new BudgetLineItem();
actualLi.YearId = be.lu_FiscalYear.FirstOrDefault(t => t.Year == actualYear);
actualLi.TypeId = be.lu_Type.FirstOrDefault(t => t.Name == "Actual");
actualLi.Dept = be.lu_Department.FirstOrDefault(t => t.Name == DeptName)
actualLi.LineItemId = be.lu_LineItem.FirstOrDefault(t => t.Name == revenueType)
actualLi.Amount = actualAmount;
be.AddToBudgetLineItems(actualLi);
be.SaveChanges();

我建议直接附加实体而不是“ID”。这将解决问题,因为您的数据库上下文将处理它所设计的实体关系

如果所有这些Id都是FK,则将它们更改为像lu_Department那样的实体分配