使用 Entity Framework 5 代码优先的视图

Posted

技术标签:

【中文标题】使用 Entity Framework 5 代码优先的视图【英文标题】:Using a View with Entity Framework 5 Code First 【发布时间】:2012-11-08 21:40:14 【问题描述】:

我创建了一个 SQL Server 视图,它在我的模型中的其他表/实体上执行一些相当复杂的逻辑,并公开一系列列。除了其中一列之外,所有列都是简单类型(bigints、nvarchars 等),但其中一列是我的模型中的复杂实体。

我创建了一个映射到该视图的实体,如下所示:

public class NetworkSuppliersByClient : Entity, IKeyed<long>

    public long NetworkSuppliersByClientId  get; set; 

    public long NetworkId  get; set; 
    public String NetworkName  get; set; 
    public long OwningClientId  get; set; 
    public long ClientId  get; set; 
    public virtual Supplier Supplier  get; set; 
    public bool PublicEntry  get; set; 

    public long GetKey ()
    
        return NetworkSuppliersByClientId;
    

如您所见,Supplier 条目映射到模型中的现有实体,它本身是具有其他包含实体(也称为表)的复杂类型。

我遇到的问题是,当我尝试从视图中读取时,我收到错误“实体类型 NetworkSuppliersByClient 不是当前上下文模型的一部分。强>”。

但是,当我尝试将具有上下文的实体注册为 DbSet 时,我收到错误“数据库中已经有一个名为“NetworkSuppliersByClients”的对象。 " 因为它试图创建一个与现有视图同名的表。

有什么办法可以解决这个问题,例如禁止 EF 在启动时尝试创建表,还是有更好的方法从视图中读取?

【问题讨论】:

我也有类似的问题。很想听听如何解决这个问题:) 【参考方案1】:

对于其他感兴趣的人,我最终只是回避了这个问题。

我将实体 NetworkSuppliersByClient(如上所示)直接映射到来自视图响应的响应,但我放弃了尝试将 Supplier 实体作为嵌入式实体返回而不是将其作为原始 long 返回。

public class NetworkSuppliersByClient : Entity, IKeyed<long>

    public long NetworkSuppliersByClientId  get; set; 

    public long NetworkId  get; set; 
    public String NetworkName  get; set; 
    public long OwningClientId  get; set; 
    public long ClientId  get; set; 
    public long SupplierId  get; set;     <-- Long, rather than "Supplier"
    public bool PublicEntry  get; set; 

    public long GetKey ()
    
        return NetworkSuppliersByClientId;
    
 

获得供应商 ID 列表后,我执行后续实体框架查询(使用 .Contains() 方法)以将所有供应商作为真正的 EF 实体返回。

关键是实体(在我上面的例子中是 NetworkSuppliersByClient)不应该作为 DbContext 子类中声明的 DbSet 成员存在,或者确实被现有 DbSet 中已经存在的任何实体引用。如果您强制执行此规则,那么 Entity Framework 将不会在启动时尝试创建表,并且不会与现有视图产生任何冲突。

【讨论】:

以上是关于使用 Entity Framework 5 代码优先的视图的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core 5 重新加载问题

entity framework 性能真那么差

Entity Framework 5.0.0 Function Import 以及 Implicit REF CURSOR Binding

Entity Framework 5.0 PostgreSQL (Npgsql) 默认连接工厂

转:Entity Framework 5.0 Code First全面学习

Entity Framework 5.0 Code First全面学习