Использование .NET EFCore 3.0 - типы запросов устарели, и теперь мы переходим к «Безключевой тип сущности» в Entity Framework Core 3.0.
Мое требование - сопоставить количество представлений только для чтения из базы данных MS SQL с DbContext с использованием нового синтаксиса HasNoKey()
.
- Возвращенные объекты только для чтения должны загружать связанные с ними объекты только для чтения.
- Есть ли способ объединить представления друг с другом и автоматически загружать связанные объекты?
- Возможно, есть другой способ использовать представления и объекты только для чтения, отличные от 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 ().
Может бытьсопоставлены с определяющим запросом. Определяющим запросом является запрос, объявленный в модели, который действует как источник данных для типа объекта без ключа.