2011-09-18 123 views
64

我如何使用数据库视图中的实体框架代码首先,如何使用代码第一个实体框架的看法

+0

无问题的答案在下面解释了如何使用EF迁移的视图。看到[这个答案](https://stackoverflow.com/a/18707413/1185136)为一个类似的问题。 –

回答

68

如果像我一样,你有兴趣只在映射实体从其他数据库(在ERP未来我的情况)将它们与特定于应用程序的实体相关联,然后可以在使用表格时使用视图(以相同的方式映射视图!)。显然,如果你尝试更新那些实体,如果视图不可更新,你将会得到一个异常。 该过程与正常(基于表)实体的情况相同:

  1. 为视图创建POCO类;例如FooView
  2. 在的DbContext类
  3. 使用一个FooViewConfiguration文件设置为视图不同的名称添加DbSet属性(使用ToTable(“富”);在构造函数),或设置特定性质

    public class FooViewConfiguration : EntityTypeConfiguration<FooView>  
    { 
        public FooViewConfiguration() 
        { 
         this.HasKey(t => t.Id); 
         this.ToTable("myView"); 
        } 
    } 
    
  4. 的FooViewConfiguration文件添加到模型构建器,例如ovveriding语境的OnModelCreating方法:

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
        modelBuilder.Configurations.Add(new FooViewConfiguration()); 
    } 
    
+45

+1不假设“代码优先”==自动生成数据库 – onetwopunch

+1

即使它是自动生成的,你也可以在你的IDatabaseInitializer中编写视图脚本,只要你使用一个匹配的“class ViewName:Entity”答案是暗示,你会没事的。 –

+3

@DaveJellison您是否愿意详细说明或提供关于将视图添加为IDatabaseInitializer的一部分的链接 –

8

如果所有你想要的是一堆非规范化的对象,那么你可能只是在你的DbContext类中创建了一个公共的只读IQueryable<TDenormolized>属性。

get中,您返回一个Linq结果以将非正态值投影到您的非规格化对象中。这可能比编写数据库视图更好,因为您正在编程,您不受仅使用select语句的限制。它也是编译时安全的。

只要小心不要触发枚举,如ToList()调用,这将打破延期查询,并且最终可能会从数据库中获取一百万条记录,并将它们过滤到您的应用程序服务器上。

我不知道这是否是正确的方法,但我试过了,它适用于我。

+4

我希望使用视图的原因之一是由EF生成的SQL并不总是“很好” - 我们的模型中有一些继承层次结构关于陷阱太晚了......)和使用视图允许我们手动创建SQL。只是一个对比,为什么一个视图更可取 – Carl

+1

其他不这样做的原因可能是使用递归公用表表达式,这在LINQ中不可用。但除此之外,这对于更简单的场景来说是一个好建议。 –

+0

如果您想要使用* indexed *视图的好处,则不能使用属性而不是视图。 –

2

这可能是一个更新,但首先在EF代码中使用视图只需将[Table(“NameOfView”)]添加到类的顶部,并且所有工作都应该正常工作,而无需通过其他所有人通过。此外,您还必须将其中一列报告为[关键]栏。以下是我的示例代码来实现它。

using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 

namespace SomeProject.Data 
{ 
    [Table("SomeView")] 
    public class SomeView 
    { 
     [Key] 
     public int NameID { get; set; } 
     public string Name { get; set; } 
    } 
} 

这里是上下文是什么样子

using System.Data.Entity; 

namespace SomeProject.Data 
{ 
    public class DatabaseContext : DbContext 
    { 
     public DbSet<SomeView> SomeViews { get; set; } 
    } 
} 
+1

这与接受的答案相同,只是在接受的答案使用EF Fluid API时使用DataAnnotations。 –

相关问题