2

我创建了一个 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 在启动时尝试创建表,或者有更好的方法从视图中读取?

4

1 回答 1

1

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

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

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-11-16T16:07:17.133 回答