实体框架:设置外键属性

16

我们有一个大致看起来像这样的表:

CREATE TABLE Lockers 
{
  UserID int NOT NULL PRIMARY KEY (foreign key),
  LockerStyleID int (foreign key),
  NameplateID int (foreign key)
}

所有的键都涉及到其他表,但由于应用程序的分布方式,我们更容易将ID作为参数传递。因此,我们想要做到这一点:

Locker l = new Locker { 
  UserID = userID, 
  LockerStyleID = lockerStyleID, 
  NameplateID = nameplateID 
};
entities.AddLocker(l);

我们可以用LINQ-to-SQL实现,但不能用EF吗?


这也是我想找出的事情。根据我的阅读,您必须通过导航链接提供实体。 - dtc
如果可以的话,我会稍微重新标记一下这个问题。它是针对.NET 3.5特定的,微软将在.NET 4中修复这个问题(或者我在某个地方读到过...) - Pieter Breed
2
他们在LINQtoSQL方面做得非常好,但在LINQtoEntities方面却做得很糟糕...S - ctrlShiftBryan
6个回答

16

很多人似乎对这个缺失的功能感到困扰。

  • 好消息:微软将在.NET 4.0中解决此问题。
  • 坏消息:目前,或者如果你被困在3.5上,你需要做一些额外的工作,但是它确实是可行的。

你需要按照以下方式进行操作:

Locker locker = new Locker();
locker.UserReference.EntityKey = new System.Data.EntityKey("entities.User", "ID", userID);
locker.LockerStyleReference.EntityKey = new EntityKey("entities.LockerStyle", "ID", lockerStyleID);
locker.NameplateReference.EntityKey = new EntityKey("entities.Nameplate", "ID", nameplateID);
entities.AddLocker(locker);
entities.SaveChanges();

1
是的,那个缺失的功能真让人恼火! :) - Rob
如果我需要将先前的关系设置为 null? - Pablogrind
我刚发现这个老问题。您是否知道是否有更新的方法来处理这个问题? - BZink

3
我一直在做的简化工作是在部分类中自己添加外键属性:
public int UserID
{
   get
   {
      if (this.User != null)
         return this.User.UserID;
   }
   set 
   {
      this.UserReference.EntityKey = new System.Data.EntityKey("entities.User", "ID", value);
   }
}

0

如果您不介意“污染”数据库模式,另一种方法是添加计算列。例如,如果您有一个外键字段FK_Customer,则可以定义一个新的计算列FK_Customer_Computed,其表达式为FK_Customer。当您生成\更新edmx模型时,该字段将显示为常规字段,然后您可以从实体对象引用它。

或者等待EF4 :)


0
你可以创建一个扩展方法,根据这些ID构造实体。

0

继Dylan的回答之后,Alex James撰写了一篇关于这个问题的博客,详细解释了问题以及如何使用部分类和属性解决方案。

伪造外键 - EF3.5


0
使用实体键可以解决你的问题 ;)
alk.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接