实体框架:设置外键属性

时间:2009-01-26 18:34:52

标签: c# ado.net-entity-data-model

我们有一个看起来大致如下的表:

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?

6 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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);
   }
}

答案 2 :(得分:0)

您可以根据这些ID制作一个构建实体的扩展方法。

答案 3 :(得分:0)

使用EntityKey解决您的问题;)

答案 4 :(得分:0)

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

或等待EF4:)

答案 5 :(得分:0)

继迪伦的回答之后,亚历克斯詹姆斯写了一篇关于这个问题的博客,详细解释了这个问题,以及如何进行部分类+财产解决方案。

Faking Foreign Keys - EF3.5