2015-02-07 6 views
7

나는 저녁 이래로이 문제에 봉착했습니다. 내 응용 프로그램에 SQLite 데이터베이스가 있습니다. 파일에서 SQLite DB를 만들었습니다. ERD를 다이어그램은 아래와 같습니다 enter image description hereSQLite - LINQ를 사용하여 데이터를 가져 오는 중

그리고 지금 내 응용 프로그램에서 나는 데이터베이스에 대한 연결 작성 :

public class Kantory 
    { 
     public Kantory() 
     { 
      this.kursy = new HashSet<Kursy>(); 
     } 

     [SQLite.PrimaryKey, SQLite.AutoIncrement] 
     public int id_kantory { get; set; } 
     public string nazwa { get; set; } 

     public virtual ICollection<Kursy> kursy { get; set; } 
    } 

public class Waluty 
    { 
     public Waluty() 
     { 
      this.kursy = new HashSet<Kursy>(); 
     } 

     [SQLite.PrimaryKey, SQLite.AutoIncrement] 
     public int id_waluty { get; set; } 
     public string nazwa { get; set; } 

     public virtual ICollection<Kursy> kursy { get; set; } 
    } 

public class Kursy 
    { 
     [SQLite.PrimaryKey, SQLite.AutoIncrement] 
     public int id_kursy { get; set; } 
     public int id_kantory { get; set; } 
     public int id_waluty { get; set; } 
     public decimal kurs { get; set; } 
     public System.DateTime data { get; set; } 
     public int aktualne { get; set; } 

     public virtual Kantory kantory { get; set; } 
     public virtual Waluty waluty { get; set; } 
    } 
: 내 DB에 테이블을 나타내는 클래스를 생성 한

using (var conn = new SQLiteConnection(DB_PATH)) 
{ 
    // retrieving statemets... 
} 

당신이 볼 수 있듯이 kursy 테이블에는 두 개의 외래 키 - id_kantoryid_waluty이 있습니다.

이제 매우 궁금하고 이상한 일이 발생합니다. 내가 INNER JOIN 문 정상적인 SQL의 statemets를 사용하여 일부 정보를 검색 할 때 - 그것을 잘가! :

using (var conn = new SQLiteConnection(DB_PATH)) 
{ 
    var query = new SQLiteCommand(conn); 
    query.CommandText = "SELECT * FROM Kursy INNER JOIN Kantory ON Kursy.id_kursy=Kantory.id_kantory WHERE Kantory.id_kantory = 1"; 
    var result = query.ExecuteQuery<Kursy>(); 
} 

이 코드는 잘 작동 작동합니다! 하지만 내가하려고 할 때 다음과 같은 LINQ를 사용하여 내 클래스를 사용합니다 :

using (var conn = new SQLiteConnection(DB_PATH)) 
{ 
    var result = conn.Table<Kursy>().Where(k => k.kantory.id_kantory == 1).FirstOrDefault(); 
} 

그것은 나에게 NotSupportedException이를 던졌습니다! 님에게 메일입니다 회원 액세스 표현을

를 컴파일하는 데 실패하지만 가입없이 LINQ 를 사용하여 내 클래스를 사용할 때 다른 클래스가! : 작동 그래서 결국

using (var conn = new SQLiteConnection(DB_PATH)) 
    { 
     var result = conn.Table<Kursy>().Where(k => k.id_kursy == 1).FirstOrDefault(); 
    } 

: 내 문제가 그 LINQ 쿼리을 사용하여 더 많은 하나의 테이블에 가입 할 수 없습니다. 클래스에서이 모델이 잘못된 것 같지만 실제로 이유를 모르겠습니다 ...

PS. 이것은 Windows Phone 8.1 응용 프로그램이므로 Entity Framework를 사용할 수 없습니다.

+1

Sqlite-net은 외래 키를 지원하지 않습니다. – ErikEJ

+0

@ErikEJ, 음, 위와 같이 SELECT ... FROM ... INNER JOIN ...을 사용하여 일반적인 SQL 문을 사용하면 작동합니다. 아마 외래 키를 사용하는 것 아닌가요? – XardasLord

+2

LINQ에서 SQL 로의 조인을 변환하지 않는다 – ErikEJ

답변

7

다음은 작동하는 코드입니다. SQLite 관련 어셈블리없이 EntityFramework 6.3.1 만 사용합니다.

엔티티 프레임 워크를 사용하지 않기를 바랍니다. 그에 대한 답을 추가하려면 사용중인 특정 어셈블리 SQLite을 알아야합니다. 예를 들어, DbLinq을 사용하고 있습니까?

특히 어떤 어셈블리가 다음과 같은 방법을 포함합니까? 여기 어떤 경우

  • SQLiteConnection.Table<T>()
  • SQLiteCommand.ExecuteQuery<T>()

    • 는, 엔티티 프레임 워크와 함께 작동 코드입니다.

      using System; 
      using System.Linq; 
      using System.Data.Entity; 
      using System.Collections.Generic; 
      using System.ComponentModel.DataAnnotations; 
      
      namespace SQLite 
      { 
          class Program 
          { 
           static void Main(string[] args) 
           { 
            using (var conn = new SQLiteConnection(@"C:\linqToSqlite.db")) 
            { 
             SeedEntities(conn); 
      
             // this is the query that DID work for you 
             var result1 = conn.Kursy 
              .Where(k => k.id_kursy == 1) 
              .FirstOrDefault(); 
      
             Console.WriteLine(
              string.Format("id_kursy:{0}", result1.id_kursy)); 
      
             // this is the query that did NOT work for you 
             // it does work here 
             var result2 = conn.Kursy 
              .Where(k => k.kantory.id_kantory == 1) 
              .FirstOrDefault(); 
      
             Console.WriteLine(
              string.Format("id_kursy:{0}", result2.id_kantory)); 
            } 
      
            Console.ReadKey(); 
           } 
      
           private static void SeedEntities(SQLiteConnection conn) 
           { 
            SeedEntities(conn); 
            // make sure two entities exist with the appropriate ids 
            if (!conn.Kantory.Any(x => x.id_kantory == 1)) 
            { 
             conn.Kantory 
              .Add(new Kantory() { id_kantory = 1 }); 
            } 
      
            if (!conn.Kursy.Any(x => x.id_kantory == 1)) 
            { 
             conn.Kursy 
              .Add(new Kursy() { id_kantory = 1 }); 
            } 
      
            conn.SaveChanges(); 
           }   
          } 
      
          public class SQLiteConnection : DbContext 
          { 
           public SQLiteConnection(string connString) : 
            base(connString) {} 
           public DbSet<Kantory> Kantory { get; set; } 
           public DbSet<Kursy> Kursy { get; set; } 
          } 
      
          public class Kantory 
          { 
           public Kantory() 
           { 
            this.kursy = new HashSet<Kursy>(); 
           } 
      
           [Key] 
           public int id_kantory { get; set; } 
           public virtual ICollection<Kursy> kursy { get; set; } 
          } 
      
          public class Kursy 
          { 
           [Key] 
           public int id_kursy { get; set; } 
           public int id_kantory { get; set; } 
           public virtual Kantory kantory { get; set; } 
          } 
      } 
      

      내가 사용했던 정확한 어셈블리를 모르기 때문에 다른 기법을 사용 했었습니다. 예를 들어, Table<T>() 메서드에 사용 된 어셈블리가 명확하지 않습니다.

      • EntityFramework.dll
      • EntityFramework.SqlServer.dll
      • System.dll
      • System.ComponentModel.DataAnnotations.dll

      , 그것은 EntityFramework 6.1.3로 간단하게 작동 : 그래서, 대신 DbContext.Kursy 접근과 다음 참조를 사용 SQLite 특정 조립품이 필요하지 않습니다.

      귀하의 필요에 맞는 답변을 보려면 SQLite의 특정 참조를 참조하고 있습니까?

    +0

    고마워요! 필자의 경우 FK 속성을 가상으로 설정하지 않았고 LINQ가 해당 속성을 채우지 않았습니다. 예 : 'public string Colour_Id {get; 세트; } [ForeignKey ("Colour_Id")] public virtual Color Color {get; 세트; }' – Kris

    관련 문제