Частичные классы Entity Framework создаются по Id / первичному ключу - PullRequest
1 голос
/ 25 августа 2011

Я использую Entity Framework 4.1. У меня есть нормальная модель .edmx, которая отображает класс Match в таблицу базы данных «Match», и к ней можно обращаться как обычно, используя EF.

Однако мне требуются методы пользовательских свойств для Match, поэтому я расширил это, используя частичный класс, и я могу добавить свои свойства и т. Д.

Все это прекрасно работает, однако я просто не могу понять, как создать экземпляр моего класса частичного соответствия по его первичному ключу / идентификатору. то есть, чтобы я мог передать идентификатор в конструктор и заполнить объект всеми своими данными из базы данных.

Я знаю, что мы можем сделать следующее, чтобы заполнить код вызова:

 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 Ответ

1 голос
/ 25 августа 2011

Это неправильный способ использования Entity Framework. Entity Framework не подходит для простого заполнения существующего объекта. Более того, он требует, чтобы сущность имела внутреннюю зависимость от контекста 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();      
}

Это также пример неправильного конструктора - конструктор не должен принимать такую ​​тяжелую логику. Это должно быть ответственностью какого-то другого метода инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...