Можно ли использовать существующие классы в качестве POCO в Entity Framework? - PullRequest
2 голосов
/ 20 октября 2010

Мне удалось сгенерировать документы, используя шаблон POCO от Microsoft. Работает отлично.

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

Способ, которым я пытался это сделать, заключался в создании POCO с использованием шаблона и PocoGenerator.Context для использования существующей модели, а затем в изменении сгенерированного кода, чтобы он возвращал мое выражение вместо сгенерированных классов.

это дает мне страшную «информацию сопоставления и метаданных, не найденную для EntityType MyType» .. Это может быть потому, что в базе данных есть несколько дополнительных полей, которых нет у моего объекта. Я попытался изменить объекты и удалить эти поля, но это вызывает некоторые другие проблемы ..

кто-нибудь делал это?

UDPATE

Да, можно использовать существующие классы. Единственное, на что следует обратить внимание, так это на то, что неинформативная ошибка, приведенная выше, будет вызвана несоответствием между некоторыми именами или типами свойств. Иногда среда выполнения выдает значимую ошибку с именем свойства, которое несовместимо, но это только в том случае, если оба класса действительно близки.

В любом случае, чтобы использовать существующие классы в качестве pocos, просто сгенерируйте pocos, а затем закомментируйте сгенерированные классы. Затем в xxxPocoGenerator.Context.cs добавьте необходимое пространство имен существующих объектов для использования.

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

        var properties = typeof(MyExistingClass).GetProperties();
        var tproperties = typeof(MyPOCOClass).GetProperties();

        Console.WriteLine("---------------------------------Missing or Different Properties--------------------");
        List<PropertyInfo> missingOrDifferentProperties = new List<PropertyInfo>();
        foreach (var tp in tproperties) 
            if (properties.Where(p => p.Name == tp.Name && p.PropertyType == tp.PropertyType && p.CanRead == tp.CanRead && p.CanWrite == tp.CanWrite && p.IsSpecialName == tp.IsSpecialName && p.MemberType == tp.MemberType).Count() != 1) 
                Console.WriteLine(tp.Name + " :: " + tp.PropertyType.Name);

1 Ответ

1 голос
/ 20 октября 2010

Похоже, вы ищете Code-First, который находится в последней версии CTP4 для Entity Framework.

См. http://blogs.msdn.com/b/adonet/archive/2010/07/14/ctp4codefirstwalkthrough.aspx

...