Ваш пример кода ужасно неправильн, потому что он делает вашу сущность зависимой от контекста (более того, вы не располагаете им). Весь подход 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
};