如何在代码中使用视图第一个实体框架[关闭]

问题描述 投票:73回答:4

我如何首先在实体框架代码中使用数据库视图,

.net database entity-framework view code-first
4个回答
79
投票

如果像我一样,您只对来自其他数据库的映射实体(在我的情况下是一个erp)感兴趣,将它们与特定于您的应用程序的实体相关联,那么您可以在使用表时使用视图(将视图映射到一样的方法!)。显然,如果您尝试更新这些实体,如果视图不可更新,您将收到异常。该过程与普通(基于表)实体的情况相同:

  1. 为视图创建一个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,例如,使上下文的OnModelCreating方法失效: protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new FooViewConfiguration ()); }

12
投票

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

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; }
    }
}

9
投票

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

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

请注意不要触发像ToList()调用这样的枚举,它会破坏延迟查询,最终可能会从数据库中获取一百万条记录并在应用程序服务器上过滤它们。

我不知道这是不是正确的方法,但我尝试过,它对我有用。


0
投票

我知道这是一个老问题,这里有很多答案,但是当我使用this回答并且在包管理器控制台中使用update-database命令时发生错误时,我被迫出了问题:

数据库中已经有一个名为“...”的对象。

我使用这些步骤来解决这个问题:

  1. 在程序包管理器控制台中运行此命令:Add-migration initial
  2. 在Migrations文件夹下,您可以找到... _ intial.cs文件,打开它并注释或删除任何与您要映射的类相关的命令
  3. 现在,您通常可以使用update-database命令对模型进行任何其他更改

希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.