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,缺少的功能令人讨厌!)如果我需要为以前的关系设置一个空值?我刚刚发现了这个老问题。你知道有没有更新的方法可以做到这一点吗?