如何首先在实体框架代码中使用数据库视图,
答案 0 :(得分:79)
如果像我一样,您只对来自其他数据库的映射实体(在我的情况下是一个erp)感兴趣,将它们与您的应用程序特定的实体相关联,那么您可以在使用表时使用这些视图(map视图以同样的方式!)。显然,如果您尝试更新这些实体,如果视图不可更新,您将收到异常。 该过程与普通(基于表)实体的情况相同:
使用FooViewConfiguration文件为视图设置不同的名称(使用ToTable(“Foo”);在构造函数中)或设置特定属性
public class FooViewConfiguration : EntityTypeConfiguration<FooView>
{
public FooViewConfiguration()
{
this.HasKey(t => t.Id);
this.ToTable("myView");
}
}
将FooViewConfiguration文件添加到modelBuilder,例如,将上下文的OnModelCreating方法移除:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new FooViewConfiguration ());
}
答案 1 :(得分:12)
这可能是一个更新但是要使用EF代码的视图首先只需将[Table(&#34; NameOfView&#34;)]添加到类的顶部,所有这些都应该正常工作而不必经历所有的箍其他人都在经历。此外,您还必须将其中一列报告为[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; }
}
}
答案 2 :(得分:9)
如果你想要的只是一堆反规范化的对象,那么你可能只是在IQueryable<TDenormolized>
类中创建了一个公共的get-only DbContext
属性。
在get
中,您返回一个Linq结果,将去正规化的值投影到您的非规范化对象中。这可能比编写DB View更好,因为您正在编程,您不仅仅使用select
语句。它也是编译时类型安全的。
请注意不要触发ToList()
调用之类的枚举,否则会破坏延迟查询,最终可能会从数据库中获取一百万条记录并在应用程序服务器上过滤它们。
我不知道这是不是正确的方法,但我尝试过,它对我有用。
答案 3 :(得分:0)
我知道这是一个老问题,并且这里有很多答案,但是当我使用this答案时,我被迫提出一个问题,并且在Package Manager控制台中使用update-database命令时发生了错误:>
数据库中已经有一个名为“ ...”的对象。
并且我使用以下步骤来解决此问题:
希望有帮助。