题
我们有一个大致如下所示的表:
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 专门写了一篇博客,详细解释了这个问题以及如何进行部分类 + 属性解决方案。
不隶属于 StackOverflow