是否可以在Entity Framework中将现有类用作POCO

时间:2010-10-20 19:41:19

标签: linq entity-framework poco

我能够使用Microsoft的POCO template生成pocos。它很棒。

我的问题是如何修改此模板或任何其他模板以使用来自不同程序集的现有对象,并将数据加载到它们中。

我尝试的方法是使用模板创建POCO,使用现有模型创建PocoGenerator.Context,然后修改生成的代码以返回我的clasess而不是生成的类。

这给了我可怕的“无法找到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 个答案:

答案 0 :(得分:1)

听起来您可能正在寻找最新的CTP4 for Entity Framework中的Code-First。

请参阅http://blogs.msdn.com/b/adonet/archive/2010/07/14/ctp4codefirstwalkthrough.aspx

相关问题