我正在使用VS2008(.NET 3.5)和基于SQL Server的实体框架。我希望在不使用Include()
方法链接表的情况下获取外键列的值。
例如,简单的作者有许多书籍样本。
var book = context.Books.First();
int authorId = book.Author.AuthorId;
在这种情况下,抛出异常,因为Author为null。我想获取作者ID,但不需要Author对象的其余部分。 Book类没有AuthorId
属性。
我确信有办法做到这一点,可能是直接编辑EDMX,也可能是通过设计师 - 任何想法如何开始?
由于
答案 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(); }
}