我如何使用数据库视图中的实体框架代码首先,如何使用代码第一个实体框架的看法
回答
如果像我一样,你有兴趣只在映射实体从其他数据库(在ERP未来我的情况)将它们与特定于应用程序的实体相关联,然后可以在使用表格时使用视图(以相同的方式映射视图!)。显然,如果你尝试更新那些实体,如果视图不可更新,你将会得到一个异常。 该过程与正常(基于表)实体的情况相同:
- 为视图创建POCO类;例如FooView
- 在的DbContext类
使用一个FooViewConfiguration文件设置为视图不同的名称添加DbSet属性(使用ToTable(“富”);在构造函数),或设置特定性质
public class FooViewConfiguration : EntityTypeConfiguration<FooView> { public FooViewConfiguration() { this.HasKey(t => t.Id); this.ToTable("myView"); } }
的FooViewConfiguration文件添加到模型构建器,例如ovveriding语境的OnModelCreating方法:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new FooViewConfiguration()); }
+1不假设“代码优先”==自动生成数据库 – onetwopunch
即使它是自动生成的,你也可以在你的IDatabaseInitializer中编写视图脚本,只要你使用一个匹配的“class ViewName:Entity”答案是暗示,你会没事的。 –
@DaveJellison您是否愿意详细说明或提供关于将视图添加为IDatabaseInitializer的一部分的链接 –
如果所有你想要的是一堆非规范化的对象,那么你可能只是在你的DbContext
类中创建了一个公共的只读IQueryable<TDenormolized>
属性。
在get
中,您返回一个Linq结果以将非正态值投影到您的非规格化对象中。这可能比编写数据库视图更好,因为您正在编程,您不受仅使用select
语句的限制。它也是编译时安全的。
只要小心不要触发枚举,如ToList()
调用,这将打破延期查询,并且最终可能会从数据库中获取一百万条记录,并将它们过滤到您的应用程序服务器上。
我不知道这是否是正确的方法,但我试过了,它适用于我。
我希望使用视图的原因之一是由EF生成的SQL并不总是“很好” - 我们的模型中有一些继承层次结构关于陷阱太晚了......)和使用视图允许我们手动创建SQL。只是一个对比,为什么一个视图更可取 – Carl
其他不这样做的原因可能是使用递归公用表表达式,这在LINQ中不可用。但除此之外,这对于更简单的场景来说是一个好建议。 –
如果您想要使用* indexed *视图的好处,则不能使用属性而不是视图。 –
这可能是一个更新,但首先在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; }
}
}
这与接受的答案相同,只是在接受的答案使用EF Fluid API时使用DataAnnotations。 –
- 1. 设计代码第一个实体框架实体框架
- 2. 实体框架代码第一
- 3. WPF和实体框架代码第一
- 4. 使用代码第一个实体框架初始化类
- 5. 实体框架代码第一个只读实体
- 6. 实体框架 - 代码第一个关系:一对一个
- 7. 实体框架代码第一个默认的SQL Server实例?
- 8. 实体框架代码第一个双一对一的关系
- 9. 嘲讽代码第一实体框架的实体
- 10. 使用实体框架代码第一种方法做一对一的关系?
- 11. 实体框架代码第一个循环引用
- 12. C#:使用实体框架代码访问数据库 - 第一
- 13. 实体框架代码第一个级联删除一对多
- 14. 实体框架 - 代码第一 - 一个与共享主键
- 15. 实体框架代码第一个DbConfiguration为多个数据库
- 16. 实体框架代码第一个和多个程序集
- 17. 实体框架代码第一个 - 共享的一对多实体
- 18. ASP.NET实体框架代码gridview上的第一个外键
- 19. 实体框架代码第一个0到1的映射
- 20. 实体框架代码第一:DateTime2的哪个DataType属性?
- 21. 实体框架代码的第一个关系
- 22. 代码第一个实体框架多对多的关系
- 23. 实体框架代码第一次插入方法挂钩
- 24. 使用RepositoryBase类中的IDbSet的实体框架代码第一个ctp 5
- 25. 实体框架代码第一个默认数据库位置
- 26. 代码第一个实体框架继承
- 27. 实体框架代码第一个函数
- 28. 实体框架代码第一个CTP5映射
- 29. 实体框架代码第一个计算属性
- 30. 实体框架代码第一个错误
无问题的答案在下面解释了如何使用EF迁移的视图。看到[这个答案](https://stackoverflow.com/a/18707413/1185136)为一个类似的问题。 –