2011-02-02 1 views
0

Я не уверен, как я могу получить метаданные EntityFramework для Entity (у меня есть мой дизайнер EF/edmx) для объекта Poco.Можно ли определить, к какому объекту сопоставляется Poco, используя код для Entity Framework CTP5?

Например.

Моя диаграмма имеет объект, называемый User. У меня также есть класс Poco под названием User. У меня создается впечатление, что имя Entity и Poco должны быть одного и того же имени, поэтому соглашение может автоматически отображать два (вместе с poco, имеющим одинаковые имена свойств и т. Д.)

Так что если У меня есть тип Poco, как я могу получить Entity и, следовательно, проверить, что объект видит метаданные, например EntityKey или StoreGeneratedPattern и т. д.?

О - кстати ... Я не знаю, что тип Poco есть .. смысл .. класс использует Generics ...

public class GenericRepository<T> : IRepository<T> where T : class 
{ ... } 

Итак, я думал, что я буду иметь спросить контекст ... захватить меня объект, который имеет name == typeof(T).Name или что-то еще ...

ответ

0

Если у вас есть доступ к ObjectContext (который, я думаю, вы ДОЛЖНЫ иметь, поскольку EntityKey/EntityState не имеет смысла без контекст), вы можете использовать следующее:

ObjectStateEntry ose = 
    context.ObjectStateManager.GetObjectStateEntry(yourObject); 

Оттуда вы можете получить все виды забавных свойств: http://msdn.microsoft.com/en-us/library/system.data.objects.objectstateentry.aspx

Вы также можете найти TryGetObjectStateEntry(...) быть под рукой.

+0

heya :) хм. я определенно имею доступ к Контексту (который является DbContext) .. но в этом контексте нет свойства ObjectStateManager? его переименовать в CTP5? –

+0

Также .. что произойдет, если у меня нет никаких объектов в памяти? могу ли я по-прежнему захватывать структуру и запрашивать свойства против этого? –

+0

Поскольку вы используете DbContext, вы можете сказать ((IObjectContextAdapter)) .ObjectContext – anon

1

Доступ к метаданным отображения, как правило, выполняется ObjectContext.MetadataWorkspace. CTP5 скрывает ObjectContext экземпляр, и большинство его классов сопоставления, связанных с отображением (на основе DbMappingMetadataItem), являются внутренними или содержат только внутренние элементы.

Похоже, что ваш DbContext автогенерируется из EDMX. Вероятно, вы можете сделать это в этом случае, создайте DbContext, вызвав конструктор, который принимает ObjectCotnext. В этом случае у вас будет доступ к ObjectContext и всем его методам/свойствам.

Зачем вам это нужно? Если вам нужно что-то особенное в вашем репозитории, вам следует создать специальный репозиторий для этого типа. Общий репозиторий - это концепция только для очень простых решений.

+0

, потому что у меня есть общее репо, я пытаюсь найти эквивалентную Entity poco, которую я создал на дизайнере. Если я могу найти эквивалентную Entity в конструкторе/MetData, тогда найдите, какое свойство на этом Entity является первым EntityKey AND StoreGeneratedPattern == Identity, тогда я могу сделать некоторые настраиваемые вещи. Прямо сейчас, я использую Конвенцию прямо сейчас, чтобы найти это свойство .. поэтому я надеялся использовать конструктор Entity/метаданные вместо соглашения. –

+0

В таком случае вы должны просто моделировать все свои сущности, чтобы содержать один ключ с тем же типом и с тем же именем.Затем вы определите интерфейс, который потребует свойство с тем же именем и реализует этот интерфейс во всех ваших enitites. Затем ваш общий репозиторий может использовать ограничение для универсального типа для реализации интерфейса, и у вас будет прямой доступ к свойству. –

+1

Я не хотел, чтобы мой poco-интерфейс был интерфейсом, который используется для настойчивости. Для меня это постоянный запах кода на poco .., когда poco не должен заботиться о сохранении в _any_ way. В настоящее время я использую Конвенцию -> найдите первое свойство, которое заканчивается на «Id», и это Identity. Или вы можете определить имя свойства при построении (которое обрабатывает DI/IoC). Но это все еще не очень хорошо, ИМО. Работает - конечно. Я надеялся использовать свойства EF MetaData .., что на 100% точнее. Мысли? –