Entity Framework с внешними ключами - PullRequest
0 голосов
/ 02 октября 2018

Вкратце, как Entity Framework предполагает работу со связанными таблицами.

aspnetcore 2.0

public class Table1{
    [Key]
    public int Id{get;set;}

    [ForeignKey("Table2")]
    public int Table2Id {get;set;}
    public virtual Table2 Table2{get;set;}
}

public class Table2{
    [Key]
    public int Id{get;set;}

}

Я предположил, что с оператором

var t1 = context.Table1List.FirstOrDefault( j => j.Id == 1)

будет иметьавтоматически заполняется Table2, но t1.Table2 имеет значение null.

Если бы мне пришлось вызывать context.Table2List.FirstOrDe ....., то t1.Table2 заполняется даже без установки свойства.Таким образом, EF признает, что отношения просто не заполняются, пока я физически не вызову БД.

Является ли мое понимание того, как EF работает неправильно, или это просто ошибка в моем коде.Может быть, что-то делать с отложенной загрузкой.

Я прочитал, прочитал и прочитал учебники Microsoft, но не очень понимаю, как это работает Предположим, что он будет работать, а не как он на самом деле работает.

Только в таблицах 1 и 2иметь отношения один к одному друг с другом.

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Обновление:

Вы должны изменить свою модель следующим образом:

public class Table1{
    public int Id{get; set;} //Primary key by convention
    [ForeignKey("Table2")]
    public int Table2Id{get; set;}
    public virtual Table2 Table2{get; set;}
}

public class Table2{
    public int Id{get; set;} //Primary key by convention
    public virtual Table1 Table1{get; set;}
}

И в вашем контексте вы должны установить это:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Configure table1 & table2 entity
    modelBuilder.Entity<Table2>()
                .HasOptional(s => s.Table1) // Mark Table1 property optional in Table2 entity
                .WithRequired(ad => ad.Table2); // mark Table1 property as required in Table2 entity. Cannot save Table1 without Table
}

И когда вы хотите получить данные из одной таблицы, а также получить данные из связанной таблицы, вы используете метод Include в своем запросе, например:

var result  = var t1 = context.Table1List.Include(x=>x.Table2).FirstOrDefault( j => j.Id == 1);

с этим кодом, у вас есть данные освязанная таблица.

если хотите, я могу создать для вас еще образец.

0 голосов
/ 02 октября 2018

То, что вам нужно, называется Ленивая загрузка

Проверяя документацию, вы видите, что вы должны явно включить отложенную загрузку:

.AddDbContext<BloggingContext>(
    b => b.UseLazyLoadingProxies()
          .UseSqlServer(myConnectionString));

И ваш Table2свойство должно быть virtual:

public class Table1 
{  
    public virtual Table2 Table2{get;set;}
}

Вам даже не нужен Id внешний ключ!

0 голосов
/ 02 октября 2018

Оставляя проводку в основном условно и предполагая соотношение 1: 1, вы хотели создать набор моделей, который выглядит следующим образом?

public class Table1
{
    public int Id { get; set; }     // Primary key by convention
    [ForeignKey("Table2")]
    public int Table2Id { get; set; }
    public Table2 Table2 { get; set; }
}

public class Table2
{
    public int Id { get; set; }     //Primary key by convention
    public ICollection<Table1> Table1s { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...