首先是实体框架代码和视图映射

时间:2013-06-29 18:31:21

标签: entity-framework view ef-code-first code-first

我有一个使用代码的应用程序;在搜索部分,我必须从3个表及其相关表中收集信息,以便我查看;并且因为首先没有代码的语法来创建视图(我想是这样;如果我错了请告诉我)我使用纯SQL脚本; 在模型创建上,以防止EF创建一个与表名相同的表(VIEW_SEARCH)我做了:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Ignore<View_Search>();
    }

应用程序正常工作,直到您尝试从视图中获取数据然后BANG ...

  

自创建数据库以来,支持'SearchContext'上下文的模型已更改。考虑使用代码优先迁移来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269

2 个答案:

答案 0 :(得分:1)

此错误只是说您模型文件中的内容与数据库中的内容不一致。 要使其一致,请转到程序包管理器控制台并键入Enable-Migrations,然后添加迁移yourMigrationName和Update-Database。错误应该消失。

如果要组合来自3个表的数据,只需创建一个ViewModel。

假设您有3个模型:Book,Author,BookStore,并且您希望在一个视图中包含所有信息。您创建ViewModel

public class MyViewModel 
{
   public Book myBook {get; set;}
   public Author myAuthor {get; set;}
   public BookStore myBookStore {get; set;}
}

然后在你的一体化视图的顶部添加

@model myNamespace.MyViewModel

并访问

等项目
Model.Book.title
Model.Author.name
Model.BookStore.isClosed

答案 1 :(得分:0)

我实际上正在使用Entity Framework“Code First”和观点,我这样做是这样的:

1)创建一个类

[Table("view_name_on_database")]
public class ViewClassName {
    // View columns mapping
    public int Id {get; set;}
    public string Name {get; set;}
    // And a few more...
}

2)将类添加到上下文

public class ContextName : DbContext {
    // Tables
    public DbSet<SomeTableClassHere> ATable { get; set; }
    // And other tables...

    // Views
    public DbSet<ViewClassName> ViewContextName { get; set; }

    // This lines help me during "update-database" command
    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        // Remove comments before "update-database" command and 
        // comment this line again after "update-database", otherwise 
        // you will not be able to query the view from the context.
        // Ignore the creation of a table named "view_name_on_database"
        modelBuilder.Ignore<ViewClassName>();
    }
}