entity framework:设置外键属性

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

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吗?

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

  • 好消息: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(); 

我一直在做的事情就是在部分类中自己添加外键属性:

 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解决您的问题;)

ALK。

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

或者等待EF4 🙂

继迪伦的回答之后,亚历克斯詹姆斯正在撰写一篇关于此问题的博客,完整地解释了这个问题以及如何进行部分类+属性解决方案。

伪造外键 – EF3.5