我如何首先在实体框架代码中使用数据库视图,
Answers:
如果像我一样,您仅对映射来自其他数据库的实体(在我的情况下为erp)感兴趣,以将它们与应用程序特定的实体相关联,则可以像使用表一样使用视图(在以同样的方式!)。显然,如果您尝试更新该实体,则如果视图不可更新,则会出现异常。该过程与普通(基于表)实体的情况相同:
使用FooViewConfiguration文件为视图设置其他名称(在构造函数中使用ToTable(“ Foo”);)或设置特定的属性
public class FooViewConfiguration : EntityTypeConfiguration<FooView>
{
public FooViewConfiguration()
{
this.HasKey(t => t.Id);
this.ToTable("myView");
}
}
将FooViewConfiguration文件添加到modelBuilder中,例如,检查Context的OnModelCreating方法:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new FooViewConfiguration ());
}
[Table("myView")]
,这可以说比使用创建一个更简单EntityTypeConfiguration
。
这可能是一个更新,但是要首先使用带有EF Code的视图,只需将[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; }
}
}
如果您想要的只是一堆非规范化的对象,那么您可能只是在类中创建了一个公共的get-onlyIQueryable<TDenormolized>
属性DbContext
。
在中,get
您将返回Linq结果,以将反标准化的值投影到反标准化的对象中。这可能比编写数据库视图更好,因为您正在编程,而不仅限于使用select
语句。而且它是编译时类型安全的。
请注意,不要触发枚举之类的ToList()
调用,因为它们会打断延迟的查询,您最终可能会从数据库中获得一百万条记录,并在应用程序服务器上对其进行过滤。
我不知道这是否是正确的方法,但我尝试过并且对我有用。
我知道这是一个老问题,并且这里有很多答案,但是当我使用此答案时我被迫提出问题,并且在Package Manager控制台中使用update-database命令时发生了错误:
数据库中已经有一个名为“ ...”的对象。
并且我使用以下步骤来解决此问题:
希望能帮助到你。
migrationBuilder.Sql("CREATE OR REPLACE VIEW ...
);这样同事也可以使用它来升级他们的数据库。