.net 如何在代码优先实体框架中使用视图
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7461265/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
how to use views in code first entity framework
提问by Sagar
How can I use the database view in entity framework code first,
如何首先在实体框架代码中使用数据库视图,
回答by Daniele Armanasco
If, like me, you are interested only in mapping entity coming from an other database (an erp in my case) to relate them to entities specific of your application, then you can use the views as you use a table (map the view in the same way!). Obviously, if you try to update that entities, you will get an exception if the view is not updatable. The procedure is the same as in the case of normal (based on a table) entities:
如果像我一样,您只对映射来自其他数据库(在我的情况下为 erp)的实体感兴趣,以将它们与特定于您的应用程序的实体相关联,那么您可以像使用表一样使用视图(将视图映射到以同样的方式!)。显然,如果您尝试更新该实体,并且视图不可更新,则会出现异常。该过程与正常(基于表)实体的情况相同:
- Create a POCO class for the view; for example FooView
- Add the DbSet property in the DbContext class
Use a FooViewConfiguration file to set a different name for the view (using ToTable("Foo"); in the constructor) or to set particular properties
public class FooViewConfiguration : EntityTypeConfiguration<FooView> { public FooViewConfiguration() { this.HasKey(t => t.Id); this.ToTable("myView"); } }Add the FooViewConfiguration file to the modelBuilder, for example ovveriding the OnModelCreating method of the Context:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new FooViewConfiguration ()); }
- 为视图创建一个 POCO 类;例如 FooView
- 在 DbContext 类中添加 DbSet 属性
使用 FooViewConfiguration 文件为视图设置不同的名称(使用 ToTable("Foo"); 在构造函数中)或设置特定属性
public class FooViewConfiguration : EntityTypeConfiguration<FooView> { public FooViewConfiguration() { this.HasKey(t => t.Id); this.ToTable("myView"); } }将 FooViewConfiguration 文件添加到模型构建器,例如覆盖 Context 的 OnModelCreating 方法:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new FooViewConfiguration ()); }
回答by Al Katawazi
This may be an update but to use views with EF Code first simply add [Table("NameOfView")] to the top of the class and all should work right without having to go through all the hoops everyone else is going through. Also you will have to report one of the columns as a [key] column. Here is my sample code below to implement it.
这可能是一个更新,但要在 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; }
}
}
And here is what the context looks like
这是上下文的样子
using System.Data.Entity;
namespace SomeProject.Data
{
public class DatabaseContext : DbContext
{
public DbSet<SomeView> SomeViews { get; set; }
}
}
回答by oldhouseye
If all you want is a bunch of de-normalized objects, then you might just created a public get-only IQueryable<TDenormolized>property in your DbContextclass.
如果你想要的只是一堆非规范化的对象,那么你可能只是IQueryable<TDenormolized>在你的DbContext类中创建了一个公共的 get-only属性。
In the getyou return a Linq result to project the de-normoalized values into your de-normalized objects. This might be better than writing a DB View because you are programming, you are not limited by only using selectstatements. Also it's compile time type safe.
在get您返回 Linq 结果以将非规范化值投影到非规范化对象中。这可能比编写 DB 视图更好,因为您正在编程,您不受仅使用select语句的限制。它也是编译时类型安全的。
Just be careful not trigger enumerations like ToList()calls, that will break the deferred query and you may end up with getting a million records back from the database and filter them on your application server.
请注意不要触发诸如ToList()调用之类的枚举,这会破坏延迟查询,并且您最终可能会从数据库中获取一百万条记录并在您的应用程序服务器上对其进行过滤。
I don't know if this is the right way, but I tried and it works for me.
我不知道这是否是正确的方法,但我试过了,它对我有用。
回答by Sepehr Estaki
I know this is an old question and there is many answers here, but I forced to an issue when I use thisanswer and an error occurred when I use update-database command in Package Manager Console:
我知道这是一个老问题,这里有很多答案,但是当我使用这个答案时我遇到了一个问题,并且在包管理器控制台中使用 update-database 命令时发生错误:
There is already an object named '...' in the database.
数据库中已经有一个名为“...”的对象。
and I use these steps to solve this issue:
我使用这些步骤来解决这个问题:
- run this command in Package Manager Console:Add-migration intial
- Under the Migrations folder, you can find ..._intial.cs file, open it and comment or delete any command related to your class you want to map
- now you can normally use update-database command for any other change to your models
- 在包管理器控制台中运行此命令:Add-migration initial
- 在 Migrations 文件夹下,您可以找到 ..._intial.cs 文件,打开它并注释或删除与您要映射的类相关的任何命令
- 现在您通常可以使用 update-database 命令对模型进行任何其他更改
hope it helps.
希望能帮助到你。

