【问题标题】:Using a View with Entity Framework 5 Code First使用 Entity Framework 5 代码优先的视图
【发布时间】: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 在启动时尝试创建表,还是有更好的方法从视图中读取?

【问题讨论】:

  • 我也有类似的问题。很想听听如何解决这个问题:)

标签: sql-server entity-framework ef-code-first


【解决方案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 将不会在启动时尝试创建表,并且不会与现有视图产生任何冲突。

【讨论】:

    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2013-07-10
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多