我们有一个大致如下所示的表:

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 中完成?

有帮助吗?

解决方案

这一缺失的要素似乎惹恼很多人。

  • 好消息:MS将解决这一问题。净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();

其他提示

我一直在做什么让一切变得简单是增加外键属性自己的部分类:

public int UserID
{
   get
   {
      if (this.User != null)
         return this.User.UserID;
   }
   set 
   {
      this.UserReference.EntityKey = new System.Data.EntityKey("entities.User", "ID", value);
   }
}

您可以使该构建了基于这些ID的所述实体的扩展方法。

使用一个的EntityKey解决您的问题;)

另一种方法,如果你不介意“污染”你分贝架构添加计算列,例如如果你有一个外键字段FK_Customer你可以定义一个新的计算列FK_Customer_Computed具有表达FK_Customer。当您生成\更新您的EDMX模型中场会出现像一个普通的领域,你可以再从你的实体对象的引用。

或等待EF4:)

继 Dylan 的回答之后,Alex James 专门写了一篇博客,详细解释了这个问题以及如何进行部分类 + 属性解决方案。

伪造外键 - EF3.5

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top