Ошибка первого подхода к коду: указанный элемент типа 'xxxxx' не поддерживается в LINQ to Entities - PullRequest
2 голосов
/ 29 ноября 2010

В попытке дополнительно абстрагировать свой уровень репозитория я попытался следовать подходу «сначала код», как описано здесь: http://msdn.microsoft.com/en-us/magazine/ee236639.aspx.

У меня есть отношение многие ко многим между Учетной записью иПодписка сущностей.Свойство Navigation существует в каждой сущности, указывающей на другую (например, Account.Subscription).

До того, как я создал свою собственную модель, я использовал модель, сгенерированную Entity, и ниже работал нормально ("db" - контекст сущности):

public IQueryable<Account> GetBySubscriptionId(int subId)
{
    return from a in db.Accounts
           where a.Subscriptions.Any(s => s.SubscriptionId == subId)
           select a;
}

Теперь модель для Account выглядит такthis:

public class Account
    {
        public int AccountId { get; set; }
        public string Name { get; set; }

        // nav properties
        public virtual List<Subscription> Subscriptions { get; set; }
}

И теперь, когда я пытаюсь выполнить тот же самый запрос LINQ, я получаю эту ошибку:

"Указанный член типа" Подписки "не поддерживается в LINQ дляСущности. Поддерживаются только инициализаторы, члены сущностей и свойства навигации сущностей. "

Любые предложения приветствуются.

1 Ответ

4 голосов
/ 29 ноября 2010

Попробуйте изменить подпись с

        // nav properties 
        public virtual List<Subscription> Subscriptions { get; set; }

до

        // nav properties 
        public virtual ICollection<Subscription> Subscriptions { get; set; }

Здесь бесстыдно прозвали демоверсию Скотта Хансельмана - http://www.hanselman.com/blog/SimpleCodeFirstWithEntityFramework4MagicUnicornFeatureCTP4.aspx, в которой используется этот шаблон, а также демоверсию Скотта Гатри, использующую ту же идею http://weblogs.asp.net/scottgu/archive/2010/07/23/entity-framework-4-code-first-custom-database-schema-mapping.aspx.

List<T> является конкретной реализацией различных интерфейсов (ICollection, IQueryable, IEnumerable и т. Д.), Entity Framework использует прокси-объекты при извлечении данных из базы данных, следовательно, декларации virtual, которые используют различные реализации этих интерфейсов, которые это то, откуда исходит ваша ошибка.

...