无法使用EFPocoAdapter对Persistence Ignorance(POCO)类进行投影

时间:2009-08-11 18:18:42

标签: c# entity-framework poco efpocoadapter

给出一个简单的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(...)(使用Reflector)。

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

所以...出于某种原因,它正在混合起来。

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

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

谢谢!

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

2 个答案:

答案 0 :(得分:0)

我认为问题在于如何解决用户类的问题。

要确认,您能否将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,

答案 1 :(得分:0)

我想我弄清楚为什么会这样。

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

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