Доступ к общей таблице значений кода в сгенерированных моделях EF - PullRequest
0 голосов
/ 09 июля 2011

У меня есть база данных, которая использует собственную модель для записи значений поиска (то есть состояний, типов и т. Д.). Таким образом, во всех таблицах базы данных есть различные столбцы, называемые чем-то вроде state_cdv_id, которые будут хранить целое число и ссылаться на таблицу code_value для получения значения этого состояния (то есть «CA», «AK» и т.

Я хотел бы отобразить свою модель EF так, чтобы я мог получить доступ к кодовым значениям для всех этих полей, и я не хочу делать это вручную в частичных классах для КАЖДОЙ сущности ... это много репетиция. Поэтому я хочу получить доступ к моим значениям кода, например: MyPerson.State и получить обратно строку «CA», например.

Вот то, что было бы одним геттером, который мне пришлось бы повторять много раз, если бы я делал это вручную:

    public string State
    {
        get
        {
            MyEntityContext c = new MyEntityContext();
            return c.CodeValues.Single(cv => cv.Id == RecordStatusCdvId).Value;
        }
    }

Я не знаю, какой будет наилучший подход: изменить шаблоны T4, добавить атрибуты свойств к определенным полям, а затем программно добавить к ним доступ или что-то еще.

Любая помощь?

Ответы [ 2 ]

1 голос
/ 09 июля 2011

Ваш пример кода ужасно неправильн, потому что он делает вашу сущность зависимой от контекста (более того, вы не располагаете им). Весь подход POCO только для того, чтобы этого избежать (генератор POCO T4 и генератор DbContext T4).

Если у вас есть отношение к таблице поиска в вашей базе данных, EF создаст для вас свойство навигации. Если у вас нет такой связи в базе данных и вы используете файл EDMX, вы все равно можете создать такую ​​связь в своей модели, и вы снова получите свойство навигации для таблицы поиска. Если у вас есть свойство навигации, вы можете просто:

string code = myEntity.State.Code;

Но свойство навигации должно быть загружено либо энергичной загрузкой (как описано @BrokenGlass), либо отложенной загрузкой.

Если вам не нравится идея свойства навигации и вы все еще хотите, чтобы свойство State показывало только код состояния, вы должны понять, что это значит: если вы отобразите сущность таким образом, она будет доступна только для чтения. потому что EF не сможет преобразовать составную сущность обратно в реальные таблицы, которые должны быть обновлены. Можно отобразить сущность так, как вы хотите, но это рассматривается как сложный (и в большинстве случаев ненужный) сценарий, который работает, только если у вас есть файл EDMX (не с первым подходом кода). Выборы:

  • Создание представления базы данных и сопоставление представления с новым объектом
  • Создать DefiningQuery вручную в файле EDMX (открытый как XML) и сопоставить его с новым объектом (как только вы это сделаете, вы не сможете больше обновлять свою модель из базы данных или генерировать базу данных из модели)
  • Создание QueryView вручную в файле EDMX (открывается в формате XML) и сопоставление его с новым объектом (для этого требуется сопоставление исходных объектов)

Вам придется делать это для каждой таблицы, где вы хотите такое отображение. В любом случае, эта сложность с ручным изменением EDMX не нужна, потому что вы можете просто создавать собственные классы, такие как:

public class SomeViewModel // I suppose your main target is to have codes in presentation layer
{
    public string SomeData { get; set; }
    public string State { get; set; }
}

и использовать проекционный запрос

Если у вас есть свойство навигации:

var data = from x in context.SomeEntities
           select new SomeViewModel
               {
                   SomeData = x.SomeData,
                   State = x.State.Code  
               };

Если у вас нет свойства навигации

var data = from x in context.SomeEntities
           join y in context.LookupValues on x.LookupId equals y.Id
           select new SomeViewModel
               {
                   SomeData = x.SomeData,
                   State = y.Code  
               };
1 голос
/ 09 июля 2011

Если между сущностью и таблицей code_value существует отношение 1: 1, у сущности уже должно быть свойство State, которое по умолчанию будет иметь значение null по умолчанию, затем вы можете заполнить его, используя Include в запросах вашей БД:

var foo = context.MyEntities.Include( x => x.State);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...