0

给定一个简单的 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 )

4

2 回答 2

0

我认为问题在于如何解决 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();

高温下,

于 2009-08-12T08:17:29.660 回答
0

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

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

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

于 2010-10-30T06:24:17.907 回答