DbContext выдает исключение в запросе при доступе через интерфейс

Я создал интерфейс, который реализует мой класс DbContext. , это позволяет мне создать поддельный контекст базы данных для модульного тестирования. Это хорошо работает для всех моих запросов LINQ, кроме одного, где я получаю следующее исключение:

Unable to create a constant value of type 'DemoApp.Member'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.

Выполнение запроса LINQ через интерфейс вызывает указанное выше исключение, однако при выполнении одного и того же запроса непосредственно в моем DBContext запрос работает на 100%. Вот интерфейс и соответствующая демонстрация cod Определения:

    interface IDemoContext : IDisposable
{
    IDbSet<Member> Members { get; set; }
    IDbSet<Team> Teams { get; set; }
}

public partial class DemoContext : DbContext, IDemoContext
{
    public DemoContext() : base("name=DemoContext"){}

    public IDbSet<Member> Members { get; set; }
    public IDbSet<Team> Teams { get; set; }
}

public partial class Member
{
    public Member()
    {
        this.SecondaryTeams = new HashSet<Team>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public int? PrimaryTeamID { get; set; }

    public virtual Team PrimaryTeam { get; set; }
    public virtual ICollection<Team> SecondaryTeams { get; set; }
}

public partial class Team
{
    public Team()
    {
        this.PrimaryMembers = new HashSet<Member>();
        this.SecondaryMembers = new HashSet<Member>();
    }

    public int ID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Member> PrimaryMembers { get; set; }
    public virtual ICollection<Member> SecondaryMembers { get; set; }
}

Каждый член потенциально принадлежит к одной основной команде и, возможно, ко многим второстепенным командам. Следующий демонстрационный код вызывает исключение:

using (IDemoContext dbi = new DemoContext())
        {
            var members =
                (from member in dbi.Members
                select new
                {
                    Name = member.Name,
                    Team = member.PrimaryTeam.Name,
                    SecondaryTeams = from secondaryTeam in member.SecondaryTeams
                        join primaryMember in dbi.Members
                        on secondaryTeam.ID equals primaryMember.PrimaryTeamID
                        into secondaryTeamMembers
                        select new
                        {
                            Name = secondaryTeam.Name,
                            Count = secondaryTeamMembers.Count()
                        }
                }).ToList();
        }

Если я изменю первую строку на:

using (DemoContext dbi = new DemoContext())

, то запрос будет выполняться безупречно.

Мои вопросы:

  1. Почему он работает через DemoContext, а не IDemoContext?
  2. Как мне изменить IDemoContext, чтобы этот запрос работал через интерфейс?
6
задан Beyers 19 January 2012 в 23:53
поделиться