Entity Framework 4.3 POCO Включить в сложные типы выдает исключение - PullRequest
0 голосов
/ 15 февраля 2012

Я использую динамический способ включения «родительских свойств» при извлечении сущностей из БД.Однако, поскольку это проверяет, является ли свойство типом значения (или строкой) или не перечисляемым чем-то (исключая их), оно также будет включать объекты, которые определены как сложные типы.Это приведет к исключению.

Можно ли проверить, был ли объект определен как сложный тип?

Пожалуйста, посмотрите этот пример кода:

public IEnumerable<object> LookupExtent(Type type)
{
        var set = Set(type);

        DbQuery q = null;

        foreach (var prop in type.GetParentProperties())
        {
            if (q == null)
                q = set.Include(prop.Name);
            else
                q = q.Include(prop.Name);
        }

        return q.ToObjectArray();
    }

PS: Да, я знаю, что это не удастся, если у меня нет родительских свойств ...

1 Ответ

1 голос
/ 16 февраля 2012

У него гораздо больше проблем.Что произойдет, если ваша сущность содержит дополнительные несопоставленные свойства?Вы можете попросить EF дать вам имена всех сопоставленных навигационных свойств.Получить информацию из метаданных EF - это немного науки, но это возможно.Попробуйте что-то вроде этого (код ожидает, что вы используете DbContext API, но его можно легко изменить на ObjectContext API):

ObjectContext objectContext = ((IObjectContextAdapter) dbContext).ObjectContext;
MetadataWorkspace workspace = objectContext.MetadataWorkspace;
EntityContainer container = 
    workspace.GetEntityContainer("NameOfYourContextClass", true, DataSpace.CSpace);
EntitySet entitySet = 
    container.GetEntitySetByName("NameOfYourPropertyExposingDbSetOnTheContext", true);
IEnumerable<string> navigationPropertyNames = 
    entitySet.ElementType.NavigationProperties.Select(n => n.ToString());

Ключ предоставляет правильные имена в GetEntityContainer и GetEntitySetByName, и онтакже является основным отличием между первым кодом и моделью db / first.Если вы используете код первым, эти имена следуют некоторым соглашениям.Если вы используете EDMX, вы можете управлять этими именами в конструкторе.

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

...