【问题标题】:Entity Framework: Setting a Foreign Key Property实体框架:设置外键属性
【发布时间】:2010-10-03 14:40:55
【问题描述】:

我们有一个大致如下所示的表格:

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?

【问题讨论】:

  • 这也是我想知道的。根据我阅读的内容,您必须通过导航链接为其提供实体。
  • 如果可以的话,我会稍微重新标记一下这个问题。它特定于 .NET 3.5,MS 将解决 .NET 4 的问题(或者我在某处读到...)
  • 他们的 LINQtoSQL 如此正确,而 LINQtoEntities 如此错误......S

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


【解决方案1】:

继 Dylan 的回答之后,Alex James 写了一篇关于此问题的博客,详细解释了问题以及如何进行部分类 + 属性解决方案。

Faking Foreign Keys - EF3.5

【讨论】:

    【解决方案2】:

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

    或者等待 EF4 :)

    【讨论】:

      【解决方案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);
         }
      }
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 是的,缺少的功能很烦人! :)
        • 如果我需要将之前的关系设置为空?
        • 我刚刚发现了这个老问题。您是否碰巧知道是否有更新的方法可以做到这一点?
        【解决方案5】:

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

        说吧。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2011-02-14
            • 1970-01-01
            • 2022-11-19
            • 1970-01-01
            • 2018-10-25
            • 1970-01-01
            • 1970-01-01
            • 2023-04-02
            • 1970-01-01
            相关资源
            最近更新 更多