【问题标题】:Is it possible to use existing classes as POCOs in Entity Framework是否可以在实体框架中使用现有类作为 POCO
【发布时间】:2010-10-20 19:41:19
【问题描述】:

我能够使用来自 Microsoft 的 POCO template 生成 pocos。效果很好。

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

我尝试的方法是使用模板创建 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);

【问题讨论】:

  • 主题阅读:“是否可以在实体框架中使用令人兴奋的类作为 POCO?”抱歉,您的代码中没有令人兴奋的类。请添加一个令人兴奋的课程,然后再试一次。 :-)
  • 好吧,我只是厌倦了无聊的课程。
  • @SonicSoul 这个问题因为修改而被顶到了首页。看来您在“更新”部分自己回答了。如果您仍然认为它相关,您介意将其转换为(接受的)答案吗?
  • @GertArnold 当然,已发布。

标签: linq entity-framework poco


【解决方案1】:

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

Link

【讨论】:

  • 如果我采用 Code-First 方法,会创建表格吗?因为我不想那样做。这些表已经存在,我无法修改它们。我只想使用现有的类,而不必手动将实体翻译成它们。在我的情况下,使用现有的类是一个硬性要求。
  • 您可以先在现有数据库中使用代码,请参阅weblogs.asp.net/scottgu/archive/2010/08/03/… 但我会提醒您,目前它只是一个 CTP,并且存在“问题”。您最好先使用数据库,然后使用 Automapper 在 Entity Framework 对象和现有类之间进行映射。
【解决方案2】:

根据要求,这是我的答案:

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-28
    • 2012-01-09
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多