如何在代码中使用视图第一个entity framework

我怎样才能在entity framework代码中使用数据库视图,

如果像我一样,只关心来自其他数据库的映射实体(在我的情况下是一个erp),以便将它们与特定于应用程序的实体相关联,那么您可以在使用表格时使用视图(将视图映射到一样的方法!)。 显然,如果你试图更新那些实体,如果这个视图是不可更新的,你将会得到一个exception。 过程与正常(基于表)实体的情况相同:

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

    public class FooViewConfiguration : EntityTypeConfiguration<FooView> { public FooViewConfiguration() { this.HasKey(t => t.Id); this.ToTable("myView"); } } 
  4. 将FooViewConfiguration文件添加到modelBuilder,例如ovveriding Context的OnModelCreating方法:

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

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

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

只要小心,不要像ToList()调用那样触发枚举,这将打破延迟查询,最终可能会从数据库中获取一百万条logging,并将其过滤到应用程序服务器上。

我不知道这是否是正确的方法,但我尝试过,并为我工作。

这可能是一个更新,但首先使用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; } } }