【问题标题】:Can't do projections to Persistence Ignorance (POCO) class using EFPocoAdapter无法使用 EFPocoAdapter 对 Persistence Ignorance (POCO) 类进行预测
【发布时间】:2010-11-18 17:24:22
【问题描述】:

给定一个简单的 POCO 类,例如:

public class User { public int Id { get; set; } public string Name { get; set; } public string Password { get; set; } }

当我尝试使用投影到自身的查询时:

using (var context = new Context())
{
var user = context.User.Select(u => new User { Id = u.Id }).FirstOrDefault();
}

...我明白了:

未处理的异常:System.ArgumentException:“Id”不是“ORMTest1Model.Users”类型的成员

... 来自 System.Linq.Expressions.Expression 的 ValidateMemberInitArgs(...) 方法(使用反射器)。

在此方法中,binding.Member.DeclaringType 的类型是 PocoAdapters.UserAdapter 类型(生成的),变量“type”的类型是 User 类型(POCO 类)。

所以...由于某种原因,事情变得混乱了。

有趣的是,如果我创建一个 MyUser 类,它是 poco 类 User 的精确副本,它可以正常工作,并且 ValidateMemberInitArgs(...) 中的两种类型都是 MyUser 类型。

任何人都可以重现该问题并阐明解决方案吗?

谢谢!

(项目讨论列表中相同问题的链接:http://code.msdn.microsoft.com/EFPocoAdapter/Thread/View.aspx?ThreadId=2138

【问题讨论】:

    标签: c# entity-framework poco efpocoadapter


    【解决方案1】:

    我认为问题在于如何解决 User 类。

    确认一下,您能否将 POCO 类重构为 PocoUser。是否会出现同样的错误?

    var user = context.User.Select(u => new User { Id = u.Id }).FirstOrDefault();
    

    会变成

    var user = context.User.Select(u => new PocoUser { Id = u.Id }).FirstOrDefault();
    

    HTH,

    【讨论】:

      【解决方案2】:

      我想我明白为什么会这样了。

      MsSql 允许在表名中使用大写字母,但 MySql 不允许。 因此,如果您从表名中包含大写字母的 mssql 实体模型创建 poco 适配器,并使用它来查询 mysql 数据库,您将收到此类错误。

      为了解决这个问题,我只是将我的表重命名为全部小写。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-31
        • 1970-01-01
        • 2020-04-01
        • 2020-08-29
        • 2020-12-08
        • 1970-01-01
        • 2022-01-14
        • 2010-11-17
        相关资源
        最近更新 更多