Объект POCO динамических прокси EF 4.0 не соответствует типу цели - PullRequest
3 голосов
/ 22 июня 2010

Я использую EF 4.0 и POCO.Я наткнулся на эту ошибку при вставке в записи в базе данных.

Функция доступа к свойству «QualityReasonID» для объекта «BI.Entities.QualityReason» вызвала следующее исключение: «Объект не соответствует типу цели.»

При привязке данных к GridView возникают ошибки после сохранения новой записи в базе данных.Я определил, что происходит, но я не уверен, ПОЧЕМУ это происходит или я неправильно использую EF / POCO.Любое понимание будет оценено.

Исключение происходит, потому что типы объектов в IEnumerable не совпадают.Первоначальные записи в таблице имеют тип System.Data.Entity.DynamicProxies.QualityReason_E483AD567288B459706092F1825F53B1F93C65C5329F8095DD1D848B5D039F04} В то время как новый объект BI.Entities.QuailtyReg_0 * 100 * * 100 * * * * * * * * * * * * * * * * * * * * 100 * * * * * * * * * * * 100 * * * * * * * * * * 100 * * * * * * * * * * * * * 100 * 100 * * * * * * * * * * * * * * 100 * 100 * * * * * * * * * * 100*

Я исправил ошибку, изменив код выборки с:

 public IEnumerable<QualityReason> fetchQualityReasons()
    {

        IEnumerable<QualityReason> queryReasons = dbcontext.QualityReasons.AsEnumerable();
        return queryReasons;
    }

на

 public IEnumerable<QualityReason> fetchQualityReasons()
    {

        IEnumerable<QualityReason> queryReasons = from data in dbcontext.QualityReasons.AsEnumerable()
                select new QualityReason
                {
                    QualityReasonID = data.QualityReasonID,
                    QualityReasonName = data.QualityReasonName
                };
                    return queryReasons;
    }

Поэтому, чтобы обойти ошибку, я должен явно выбирать в класс POCO каждыйвремя.Такое ощущение, что я что-то не так делаю.Есть мысли?

Ответы [ 3 ]

2 голосов
/ 15 июля 2011

Ошибка вызвана тем, что GridView не обрабатывает полиморфные источники данных при использовании связанных полей. Итак, у вас есть два варианта

  1. Вместо этого используйте TemplateFields, которые могут обрабатывать полиморфные источники данных, это может изменить некоторые из вашего кода переднего плана и событий GridView.

  2. Использование Linq для создания неполиморфного источника данных, который могут обрабатывать связанные поля

      So instead of using something like ti 
    
        gvGroups.DataSource = ProductHelper.Get()
        gvGroups.DataBind();
    
    
    
        var query = from p in ProductHelper.Get()
        select new {p.ProductId, p.ProductName, p.ProductDesc, p.ProductLink};
        gvGroups.DataSource = query;
        gvGroups.DataBind();
    
1 голос
/ 16 марта 2012

Столкнулся с той же проблемой сегодня и использовал Value Injecter для ее решения.Это так просто, как:

var dynamicProxyMember = _repository.FindOne<Member>(m=>m.Id = 1);
var member = new Member().InjectFrom(dynamicProxyMember) as Member;

Вот и все:)

1 голос
/ 25 октября 2010

Я не знаю, была ли проблема решена, но у меня была такая же проблема с моим (POCO) классом "Сценарий".

Проблема исчезла при использованиисоздайте объект (POCO) iso a .... = new Scenario ().

...