2015-02-07 22 views
7

Tôi bị kẹt với vấn đề này kể từ vài buổi tối. Tôi có cơ sở dữ liệu SQLite trong đơn đăng ký của mình. Tôi đã tạo ra rằng SQLite DB từ một tập tin. Sơ đồ ERD được hiển thị dưới đây: enter image description hereSQLite - truy xuất dữ liệu bằng LINQ

Và bây giờ trong ứng dụng của tôi, tôi tạo ra một kết nối đến cơ sở dữ liệu của tôi:

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

Tôi đã tạo ra các lớp học mà đại diện cho bảng trong DB của tôi:

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

Như bạn thấy, trong bảng kursy Tôi có hai phím ngoài - id_kantoryid_waluty.

Và bây giờ điều kỳ lạ và kỳ lạ xảy ra. Khi tôi cố truy xuất một số thông tin bằng cách sử dụng các biểu thức SQL bình thường với câu lệnh INNER JOIN - nó hoạt động tốt !:

Mã này hoạt động tốt! NHƯNG khi tôi cố gắng sử dụng các lớp học của tôi sử dụng LINQ như thế này:

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

Nó ném cho tôi một NotSupportedException! Các Thông tin về là: truy cập thành viên thất bại trong việc biên dịch biểu

NHƯNG khi tôi sử dụng các lớp học của tôi sử dụng LINQ KHÔNG THAM GIA lớp khác nó hoạt động !:

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

Vì vậy, cuối cùng: vấn đề của tôi là Tôi không thể tham gia nhiều hơn một bảng bằng truy vấn LINQ. Dường như mô hình này trong lớp học là sai nhưng tôi thực sự không biết tại sao ...

PS. Đây là ứng dụng Windows Phone 8.1, vì vậy tôi không thể sử dụng Entity Framework cho điều đó.

+1

Sqlite-net không hỗ trợ khóa ngoài – ErikEJ

+0

@ErikEJ, hmm nhưng khi tôi sử dụng câu lệnh SQL bình thường như được hiển thị ở trên bằng cách sử dụng 'SELECT ... FROM ... INNER JOIN ...' nó hoạt động. Vì vậy, nó có thể sử dụng các phím nước ngoài, phải không? – XardasLord

+2

Nó không dịch các phép nối từ LINQ sang SQL – ErikEJ

Trả lời

7

Đây là mã hoạt động. Nó chỉ sử dụng EntityFramework 6.3.1 mà không có bất kỳ hội đồng SQLite cụ thể nào.

Tôi hiểu rằng bạn không muốn sử dụng Khuôn khổ thực thể. Để thêm một câu trả lời cho điều đó, suy nghĩ, chúng ta cần phải biết những gì SQLite hội đồng cụ thể bạn đang sử dụng. Ví dụ: bạn đang sử dụng DbLinq?

Cụ thể, những gì hội đồng có chứa các phương pháp sau đây?

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

Trong mọi trường hợp, đây là mã làm việc với Entity Framework.

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

Tôi sợ rằng tôi đã sử dụng một kỹ thuật khác với bạn, bởi vì tôi không biết chính xác các cụm bạn đã sử dụng. Ví dụ, nó không rõ ràng lắp ráp bạn sử dụng cho phương pháp Table<T>().Vì vậy, tôi đã sử dụng cách tiếp cận DbContext.Kursy để thay thế và tài liệu tham khảo sau đây:

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

Nói cách khác, nó hoạt động đơn giản với EntityFramework 6.1.3 và không yêu cầu bất kỳ SQLite hội đồng cụ thể nào.

Để có câu trả lời có liên quan đến nhu cầu của bạn, bạn cần tham khảo những tham chiếu cụ thể nào SQLite?

+0

Cảm ơn người đàn ông! Trong trường hợp của tôi, tôi đã không thiết lập các thuộc tính FK của tôi là ảo và LINQ không được điền vào chúng. ví dụ. 'chuỗi công khai Colour_Id {get; bộ; } [ForeignKey ("Colour_Id")] màu ảo công cộng Color {get; bộ; } ' – Kris

Các vấn đề liên quan