2012-01-19 17 views
6

arabiriminden erişildiğinde sorguda istisna atar DbContext sınıfımın uyguladığı bir arabirim oluşturdum, bu, birim sınaması için sahte bir db içeriği oluşturmama olanak sağlıyor. Ancak benim DBContext doğrudan tam aynı sorgu yürütülürken,DbContext,

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

arayüz üzerinden LINQ sorgusu yürütme yukarıdaki istisna atar: Bu aşağıdaki özel durum alıyorum birini, benim LINQ bugüne kadar sorgular herkes için iyi çalışıyor ama sorgu% 100 çalışır.

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; } 
} 

Her üye potansiyel ait tek bir birincil ekibine ve isteğe bağlı birçok ikincil takımlar: Burada arayüz ve ilgili demo kod tanımları olduğunu.

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(); 
     } 

Ben ilk satırı değiştirirseniz:

using (DemoContext dbi = new DemoContext()) 

sonra sorgu mükemmel yürütür Aşağıdaki demo kod istisna atar.

Yani benim sorular şunlardır:

  1. Neden DemoContext aracılığıyla çalışmak ve IDemoContext etmiyor?
  2. IDemoContext'i nasıl değiştiririm, bu nedenle bu sorgu arabirimde çalışır?

cevap

5

Sorguda yerel bir değişken ile dbi.Members değiştirmeyi deneyin. 'System.Data.Objects.ObjectQuery`1 Çeşidi Object:

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

artık yeni istisna atar Bu değişiklikle birlikte:

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

+0

@Beyers Temel olarak 'üye grubu' IQueryable 'türünde olmalıdır. Güncelleme yanıtı. – Eranga

+0

Başar, bu% 100 çalışır ve dbi.Members.Include (i => i.SecondaryTeams) ile benim geçici çözümümden daha iyi bir çözümdür. DBContext üzerinden değil, neden arayüzden geçtiğini tam olarak bilmek istiyoruz. – Beyers

0

çözüm Bulunan, hile sorguda SecondaryTeams dahil oldu [DemoApp.Member] ',' System.Data.Entity.IDbSet`1 [DemoApp.Member] 'türüne dönüştürülemiyor. Bu istisna hem IDemoContext hem de DemoContext üzerinde atılır.
İlgili konular