В EFCore 3.0 - как объединить связанные объекты «Только для чтения» из представлений, чтобы загружать связанные объекты - PullRequest
0 голосов
/ 06 ноября 2019

Использование .NET EFCore 3.0 - типы запросов устарели, и теперь мы переходим к «Безключевой тип сущности» в Entity Framework Core 3.0.

Мое требование - сопоставить количество представлений только для чтения из базы данных MS SQL с DbContext с использованием нового синтаксиса HasNoKey().

  1. Возвращенные объекты только для чтения должны загружать связанные с ними объекты только для чтения.
  2. Есть ли способ объединить представления друг с другом и автоматически загружать связанные объекты?
  3. Возможно, есть другой способ использовать представления и объекты только для чтения, отличные от HasNoKey?

Простая примерная схема, у Order есть много OrderItems. Если обе эти сущности исходят из представления, то как ордер загружает свои OrderItems?

public class ReadonlyActionOnDb
{
    OrdersDbContext Db; //need to pass in via constructor etc, just for demo code.
    protected void PrintOrderItems()
    {
        var custItems = Db.vOrders.Where(i=> i.CustomerId == 10).SelectMany(i=> i.OrderItems);
        foreach (OrderItemDto i in custItems ) Console.WriteLine(i.ProductName); 
    }           
}

//part of the config shown...
public partial class OrdersDbContext: DbContext
{
    public DbSet<OrderDto> vOrders { get; set; }
    public DbSet<OrderDto> vOrderItems { get; set; }

    protected void OnModelCreating(ModelBuilder modelBuilder)
    {           
        modelBuilder.Entity<OrderItemDto>().HasNoKey().ToView("vOrderItems ","dbo");

        //how do we automatically load the OrderItems into this?
        modelBuilder.Entity<OrderDto>().HasNoKey().ToView("vOrders","dbo");
    }
}

public class OrderDto
{
    public int Id { get; set; }
    public int CustomerId { get; set; }
    public ICollection<OrderItemDto> OrderItems { get; set; }
}

public class OrderItemDto
{
    public int Id { get; set; }
    public string ProductName { get; set; }
}

Я чувствую, что это должно быть достигнуто на экземпляре DbContext, я знаю, что могу вручную загрузить и присоединиться позже.

Для этой проблемы миграции не важны, поскольку администраторы баз данных принудительно устанавливают свои собственные обновления базы данных.

Ниже приведены ограничения типов сущностей без ключа, которые можно найти в документации MS ,Немного запутанно для навигации по объектам без примеров.

Характеристики типов объектов без ключей

Типы объектов без ключей поддерживают многие из тех же возможностей отображения, что и обычные типы объектов, такие как отображение наследования и свойства навигации. В реляционных хранилищах они могут настраивать объекты и столбцы целевой базы данных с помощью свободно распространяемых методов API или аннотаций данных.

Однако они отличаются от обычных типов сущностей тем, что они:

Не могут иметь ключопределены.

Никогда не отслеживаются на предмет изменений в DbContext и, следовательно, никогда не вставляются, не обновляются и не удаляются в базе данных.

Никогда не обнаруживаются по соглашению.

Поддерживается толькоподмножество возможностей отображения навигации, а именно:

Они могут никогда не выступать в качестве основного конца отношений.

Они могут не иметь переходов к собственным объектам

Они могут содержать толькоссылки на свойства навигации, указывающие на обычные объекты.

Объекты не могут содержать свойства навигации для типов безключевых объектов.

Необходимо настроить с помощью вызова метода .HasNoKey ().

Может бытьсопоставлены с определяющим запросом. Определяющим запросом является запрос, объявленный в модели, который действует как источник данных для типа объекта без ключа.

...