2015-06-16 2 views
0

Я пытаюсь использовать linq2db с сервером sql-сервера firebird. У меня есть две таблицы, которые имеют выпуск.Как использовать ассоциацию в linq2db

[Table("REQUESTS")] 
    public partial class Request 
    { 
     [Column("ID")] 
     [PrimaryKey] 
     public int Id { get; set; } 

     [Column("LATEST_REQUEST_DATA_ID")] 
     public int? LatestRequestDataId { get; set; } 

     [Association(ThisKey="LATEST_REQUEST_DATA_ID", OtherKey="ID")] 
     public virtual RequestData LatestData { get; set; } 
    } 

    [Table("REQUEST_DATA")] 
    public class RequestData 
    { 

     [Column("ID")] 
     [PrimaryKey] 
     public int Id { get; set; } 

     [Column("REQUEST_ID")] 
     public int RequestId { get; set; } 
    } 

    public class RequestDb : DataConnection 
    { 
     public ITable<Request> Requests { get { return GetTable<Request>(); } } 
     public ITable<RequestData> Data { get { return GetTable<RequestData>(); } } 
    } 

    ... 
     using (var context = new RequestDb()) 
     { 

      var r = context.Requests.FirstOrDefault(); 
      var d = context.Data.FirstOrDefault(dd => dd.Id == r.LatestRequestDataId); 
      Console.WriteLine(r); 
     } 

И я д, которые имеют результат и после того как я стараюсь, чтобы получить результат от r.LatestData, но я получаю r.LatestData является нулевым Почему я получаю r.LatestData = нуль?

ответ

2

Ваш код возвращает null, поскольку Linq2Db не принимает ассоциацию во время материализации (только если вы указали вручную). Это делается для: 1) избегать циклирования (как вы помните, нет тяжелого DataContext, поэтому он создает каждый раз новый класс) 2) для оптимизации запросов (не для создания ненужных объединений). Итак, в вашем примере вам необходимо написать:

r=context.Requests.LoadWith(request=> 
request.LatestData).FirstOrDefault(); 
Смежные вопросы