在没有Include方法的情况下在Entity Framework 1.0中获取外键值

时间:2011-07-07 03:52:16

标签: .net entity-framework foreign-keys

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

例如,简单的作者有许多书籍样本。

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

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

我确信有办法做到这一点,可能是直接编辑EDMX,也可能是通过设计师 - 任何想法如何开始?

由于

2 个答案:

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

答案 1 :(得分:1)

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

扩展方法:

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(); }
}