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?

4

6 回答 6

16

这个缺失的功能似乎惹恼了很多人。

  • 好消息:MS 将解决 .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();
于 2009-06-24T11:59:27.837 回答
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);
   }
}
于 2009-10-14T19:07:01.193 回答
0

您可以创建一个基于这些 ID 构造实体的扩展方法。

于 2009-01-26T18:43:58.557 回答
0

使用 EntityKey 可以解决您的问题;)

阿尔克。

于 2009-02-18T10:36:37.357 回答
0

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

或者等待 EF4 :)

于 2010-02-20T14:01:56.137 回答
0

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

伪造外键 - EF3.5

于 2014-03-20T10:14:56.880 回答