实体框架部分类通过Id /主键实例化

时间:2011-08-25 07:37:21

标签: c# asp.net entity-framework-4

我正在使用Entity Framework 4.1。我有一个普通的模型.edmx,它将Match类映射到'Match'数据库表,这可以使用EF正常访问。

但是我需要匹配的自定义属性方法,所以我使用部分类扩展它,我可以添加我的属性等。

所有这一切都运行正常,但我无法找到如何通过其主键/ id实例化我的部分匹配类的实例。即我可以将Id传递给构造函数,并使用数据库中的所有数据填充该对象。

我知道我们可以通过调用代码来填充以下内容:

 public Match PopulateforMatchId(int matchId)
    {
        var match = (from m in _db.Matches
                         .Include("TeamA")
                         .Include("TeamB")
                         .Include("Season")
                         .Include("Season.Competition")
                     where m.Match_ID == matchId
                     select m).FirstOrDefault();

        return match;

    }

然而,这不是我需要的,因为它不是自包含在部分类本身中,我需要它来填充自己,因为部分类中的其他属性依赖于对象本身具有其数据之前它们可以是计算

任何人都有任何想法我怎么能这样做?

由于

凯文

1 个答案:

答案 0 :(得分:1)

这是使用Entity框架的错误方法。实体框架不适合轻松填充现有对象。此外,它要求实体内部依赖于EF上下文。

如何使它工作(但我绝对不推荐它):

public Match(int matchId) 
{
    // You called constructor yourselves = you have unproxied entity without
    // dynamic change tracking and without lazy loading

    Id = matchId;

    // I'm not sure if this is possible in entity constructor but generally it should work

    // Get context somewhere - service locator pattern
    ObjectContext context = ContextProvider.GetCurrent();
    context.Matches.Attach(this);
    context.Refresh(RefreshMode.StoreWins, this);
    // Now you should have populated Match entity itself but not its navigation properties

    // To populate relations you must call separate query for each of them because `Include`
    // is possible only when the entity is created and loaded by EF and lazy loading is off
    // in this case

    context.LoadProperty(this, m => m.TeamA);
    context.LoadProperty(this, m => m.TeamB);

    Season = (from s in context.Seasons.Include("Competition")
              select s).ToList();      
}

这也是错误构造函数的例子 - 构造函数不应该采用如此重的逻辑。它应该是其他一些初始化方法的责任。