【问题标题】:How to get foreign key value for independent association without hitting database?如何在不访问数据库的情况下获取独立关联的外键值?
【发布时间】:2012-09-08 21:12:26
【问题描述】:

我正在使用独立关联(延迟加载)来访问我的代码优先模型中的相关实体,例如

public class Aaa {
  public int AaaId {get;set;}
  public string SomeValue {get;set;}
}

public class Bbb {
  public int BbbId {get;set;}
  public string SomeValue {get;set;}
  public virtual Aaa MyIndependentAssociation {get;set;}
}

但我想知道如何在不实际加载记录的情况下访问MyIndependentAssociation 的外键值。

我假设当我从数据库中检索 Bbb 实体时实际加载了 Aaa_AaaId 值(无论如何根据实体表上的调试可视化工具)。

我如何访问该值(除了将外键关联添加到我的模型中)?

【问题讨论】:

    标签: .net entity-framework entity-framework-5


    【解决方案1】:

    这是可能的。使用您的示例模型,您可以通过以下方式找到外键值:

    Bbb bbb = myDbContext.Bbbs.First();
    
    var objectContext = ((IObjectContextAdapter)myDbContext).ObjectContext;
    
    var relMgr = objectContext.ObjectStateManager.GetRelationshipManager(bbb);
    var relEnds = relMgr.GetAllRelatedEnds();
    var relEnd = relEnds.Single(); // because yor model has exactly one relationship
    var entityRef = relEnd as EntityReference<Aaa>;    
    var entityKey = entityRef.EntityKey;
    
    int foreignKeyValue = (int)entityKey.EntityKeyValues[0].Value;
    
    // to confirm that no database query happened
    Console.WriteLine(entityRef.IsLoaded); // outputs false
    

    在更一般的情况下,您在Bbb 类中有多个关系,甚至可能不止一个导航属性引用Aaa,您需要在relEnds 枚举中找到正确的元素。你也可以有复合外键。它看起来像这样:

    Bbb bbb = myDbContext.Bbbs.First();
    
    var objectContext = ((IObjectContextAdapter)myDbContext).ObjectContext;
    
    var relMgr = objectContext.ObjectStateManager.GetRelationshipManager(bbb);
    var entityRef = relMgr.GetRelatedReference<Aaa>(
        "MyEntityNamespace.Bbb_MyIndependentAssociation",
        "Bbb_MyIndependentAssociation_Target");
    var entityKey = entityRef.EntityKey;
    
    object[] compositeForeignKeyValues =
        entityKey.EntityKeyValues.Select(e => e.Value).ToArray();
    
    // to confirm that no database query happened
    Console.WriteLine(entityRef.IsLoaded); // outputs false
    

    注意,如果您在调试器中检查entityRef 对象,IsLoaded 可以是true,这会导致相关对象被加载(即使延迟加载被禁用)。

    【讨论】:

    • 很好,详细的答案。谢谢
    • P.S.最后,我决定在我的模型中同时使用外键和独立关联,因为它避免了这种复杂的代码。缺点是技术性问题:您的模型公开了原始 EF 设计人员希望您在“概念模型”中避免的“实现细节”。代码优先模型是概念模型还是存储模型是有争议的。
    • +1:你的回答解决了我的问题:stackoverflow.com/questions/13451766/…
    猜你喜欢
    • 2016-04-17
    • 1970-01-01
    • 2015-09-25
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多