【问题标题】:Get foreign key value in Entity Framework 1.0 without Include method在没有包含方法的实体框架 1.0 中获取外键值
【发布时间】:2011-07-08 12:58:10
【问题描述】:

我在 SQL Server 上使用 VS2008 (.NET 3.5) 和实体框架。我希望在不使用Include() 方法链接表的情况下获取外键列的值。

例如,简单的 Author 有很多 Books 示例。

var book = context.Books.First();
int authorId = book.Author.AuthorId;

在这种情况下,会引发异常,因为 Author 为 null。我只想获取作者 ID,但不需要 Author 对象的其余部分。 Book 类上没有 AuthorId 属性。

我确信有办法做到这一点,可能是直接编辑 EDMX,也可能是通过设计器 - 有什么开始的想法吗?

谢谢

【问题讨论】:

  • 我很惊讶图书实体中没有 AuthorID。你有在数据库中定义的外键吗?如果是这样,EF 模型生成器应该会选择它。
  • EF4 可以在不暴露外键属性的情况下创建实体链接。优点:实体对象更干净。相反:您无法轻松访问外键值
  • 如果我记得的话,EF4 包括 AuthorId,但 EF1(这就是我所使用的)没有。我只有 Author 属性,仅当您在对象集上调用 .Include("Author") 时才会填充该属性。

标签: .net entity-framework foreign-keys


【解决方案1】:

您可以获得 FK 值,但不是那么直接。代表单个实体的每个导航属性都应具有名为 XXXReference 的对属性。在你的情况下AuthorReference。这是在内部保存您的密钥的 EF 基础设施属性。您可以使用类似的代码来获取您的 FK 值:

EntityKey key = book.AuthorReference.EntityKey;
EntityKeyMembers[] keyMembers = key.EnityKeyValues;
// Now each member of this array contains Key and Value property. Key is the name of 
// primary key property in principal entity and value is its value
// If you don't have composite keys and your keys are integer you can simply use:
int authorId = (int)keyMembers[0].Value;

【讨论】:

  • 这些假设对于我正在从事的项目是正确的,所以看起来这会奏效。谢谢。
【解决方案2】:

我已经看到这提到了几个地方,可能值得一看。

扩展方法:

public static TValue GetId<TValue>(this EntityReference reference)
{
     if (reference == null)
     {
        return default(TValue);
     }

     EntityKey key = reference.EntityKey;
     if (key != null)
     {
         EntityKeyMember[] entityKeys = key.EntityKeyValues;
         if (entityKeys.Length > 0)
         {
            return (TValue)entityKeys[0].Value;
         }
     }

     return default(TValue);
}

在您的 Book 实体的部分类中:

public int AuthorId
{
   get { return AuthorReference.GetId(); }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多