【发布时间】:2019-11-06 14:16:13
【问题描述】:
使用 .NET EFCore 3.0 - 查询类型已贬值,现在我们在 Entity Framework Core 3.0 中移至 "Keyless entity type"。
我的要求是使用新的HasNoKey() 语法将一些只读视图从 MS SQL 数据库映射到 DbContext。
- 返回的只读实体必须加载其相关的读取 仅限实体。
- 有没有办法让视图相互连接并自动加载相关的 实体?
- 也许还有另一种使用视图和只读实体的方法 除了 HasNoKey?
简单示例架构,Order 有许多 OrderItem。如果这两个 Entities 都来自一个视图,那么 Order 如何加载它的 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 实例上实现,我知道我可以稍后手动加载和加入。
对于这个问题,迁移并不重要,因为 DBA 会强制执行他们自己对数据库的更新。
以下是在MS Documentation 中找到的无密钥实体类型的限制。没有示例的实体导航有点混乱。
无密钥实体类型特征
无键实体类型支持许多与 常规实体类型,如继承映射和导航 特性。在关系存储上,他们可以配置目标 通过流畅的 API 方法或数据的数据库对象和列 注释。
但是,它们与常规实体类型的不同之处在于:
无法定义键。
永远不会跟踪 DbContext 中的更改,因此永远不会 在数据库中插入、更新或删除。
按照惯例从未被发现。
仅支持导航映射功能的子集, 具体来说:
他们可能永远不会成为一段关系的主要目的。
他们可能没有导航到拥有的实体
它们只能包含指向的参考导航属性 常规实体。
实体不能包含无键实体类型的导航属性。
需要配置.HasNoKey()方法调用。
可以映射到定义查询。定义查询是查询 在充当无密钥实体的数据源的模型中声明 输入。
【问题讨论】:
标签: ef-core-3.0