EF-код, как получить свойство навигации с помощью Entity? - PullRequest
0 голосов
/ 05 июня 2018

Ниже приведена модель данных, в которой сущность A имеет свойство навигации B

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

[Serializable]
public class A : X
{     
    public List<B> B { get; set; }
}

[Serializable]
public class B : X
{
    public int AId { get; set; }
    public A A { get; set; }
}

Затем я пытаюсь получить доступ к таблице A из базы данных следующим образом:

public class MyDatabaseContext : DbContext
{
    Configuration.ProxyCreationEnabled = false;
}

public async Task<IEnumerable<T>> SelectAsync<T>() where T : X
{
    using (MyDatabaseContext db = new MyDatabaseContext ())
    {
        var dataTable = db.Set<T>();
        var temp = await dataTable.ToListAsync();

        return temp;
    }
}

Это почти работает, за исключением того, что для каждого экземпляра A, возвращенного в коллекции temp, значение B равно null.Поскольку каждый A имеет не null B в базе данных, я удивлен результатом db.Set<T>()

Вопросов :

  • Почему я получаю этот результат?
  • Что нужно сделать, чтобы db.Set<T>() вернул A с действительными (ненулевыми) B с?

Обновление Основываясь на предложении @Camilo Terevinto, я попытался без удачи

public class MyDatabaseContext : DbContext
{
    Configuration.LazyLoadingEnabled = true;
}

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Я не могу сказать, почему вы получаете null значение.Обычно, вот как one-to-one настроены в Entity Framework.

При запуске следующего кода с вашим методом SelectAsync я получаю B для каждого значения A.

public partial class X
{
    public int Id { get; set; }

    public virtual A A { get; set; }

    public virtual B B { get; set; }
}

public partial class A
{
    public A()
    {
        B = new HashSet<B>();
    }

    public int Id { get; set; }

    public virtual X X { get; set; }

    public virtual ICollection<B> B { get; set; }
}

public partial class B
{
    public int Id { get; set; }

    public int? AId { get; set; }

    public virtual A A { get; set; }

    public virtual X X { get; set; }
}

DbContext

public partial class MyDatabaseContext : DbContext
{
    ...

    public virtual DbSet<A> A { get; set; }
    public virtual DbSet<B> B { get; set; }
    public virtual DbSet<X> X { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<X>()
            .HasOptional(e => e.A)
            .WithRequired(e => e.X);

        modelBuilder.Entity<X>()
            .HasOptional(e => e.B)
            .WithRequired(e => e.X);
    }
}
0 голосов
/ 05 июня 2018

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

await dataTable.Include("B").ToListAsync();

Вам нужно будет решить, как определить, содержит ли текущий T навигационную информацию.B хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...