Невозможно выполнить проекции в класс невосприимчивости (POCO) с помощью EFPocoAdapter - PullRequest
0 голосов
/ 11 августа 2009

Учитывая простой класс 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'

... который происходит от метода ValidateMemberInitArgs (...) из System.Linq.Expressions.Expression (используйте 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 голосов
/ 30 октября 2010

Мне кажется, я понял, почему это происходит.

MsSql допускает использование заглавных букв в именах таблиц, а MySql - нет. Поэтому, если вы создадите свой адаптер poco из модели сущностей mssql, которая содержит заглавные буквы в именах таблиц, и будете использовать ее для запроса базы данных mysql, вы получите этот тип ошибки.

Чтобы это исправить, я просто переименовал свои таблицы в строчные.

0 голосов
/ 12 августа 2009

Мне кажется, проблема в том, как решается класс 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();

НТН,

Dan

...