Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架:设置外键属性_C#_Ado.net Entity Data Model - Fatal编程技术网

C# 实体框架:设置外键属性

C# 实体框架:设置外键属性,c#,ado.net-entity-data-model,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) } Locker locker = new Locker(); locker.UserReference.EntityKey = new System.Data.EntityKey("ent

我们有一张大致如下的表格:

CREATE TABLE Lockers 
{
  UserID int NOT NULL PRIMARY KEY (foreign key),
  LockerStyleID int (foreign key),
  NameplateID int (foreign key)
}
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();
所有键都与其他表相关,但由于应用程序的分布方式,我们更容易将ID作为参数传递。所以我们想这样做:

Locker l = new Locker { 
  UserID = userID, 
  LockerStyleID = lockerStyleID, 
  NameplateID = nameplateID 
};
entities.AddLocker(l);

我们可以在LINQ to SQL中实现,但不能使用EF?

您可以创建一个扩展方法,根据这些ID构造实体。

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


alk.

这个缺失的功能似乎让很多人感到烦恼

  • 好消息:微软将用.NET4.0解决这个问题
  • 坏消息:现在,或者如果你被困在3.5上,你必须做一些工作,但这是可能的
你必须这样做:

CREATE TABLE Lockers 
{
  UserID int NOT NULL PRIMARY KEY (foreign key),
  LockerStyleID int (foreign key),
  NameplateID int (foreign key)
}
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);
   }
}

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


或者等待EF4:)

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


这也是我想知道的。据我所知,你必须通过导航链接给它实体。如果可以,我会重新标记这个问题。这是针对.NET 3.5的,MS将解决.NET 4的问题(或者我在某个地方读到过…)他们将LINQtoSQL做得非常正确,而LINQtoEntities做得非常错误…SYes,缺少的功能令人讨厌!)如果我需要为以前的关系设置一个空值?我刚刚发现了这个老问题。你知道有没有更新的方法可以做到这一点吗?