将EF 6实体链接到sql server中的现有只读视图

时间:2014-07-15 16:43:51

标签: entity-framework ef-code-first

在我的mvc 5 ef6应用程序中,我需要管理两个不同的dbcontext:第一个指向我自己的db whit所有与此应用程序相关的数据。 第二个db上下文用于从现有数据库中获取数据,即两个视图,一个用于人员数据,一个用于合作伙伴数据。

所以我有一个externalDbContext

public class ExternalDbContext : DbContext
{
    public ExternalDbContext() : base("ExternalDbContext")
    {
    }

    public DbSet<Partner> Partners { get; set; }
    public DbSet<Staff> Staffers { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Entity<Partner>().ToTable("MY_PARTNER_TABLE");
        modelBuilder.Entity<Staff>().ToTable("MY_STAFF_TABLE");
        modelBuilder.Entity<Partner>().HasKey(t => t.CustomKey);
        modelBuilder.Entity<Staff>().HasKey(t => t.EmployeeId);
    }

}

}

使用服务器资源管理器我可以访问视图中的数据,但在我的应用程序中,我尝试从视图中获取数据

       var objCtx = new ExternalDbContext();
       var utente = (from u in objCtx.Staffers
                      where u.UserID1 == myuser
                      select u);

我收到错误消息

 Model compatibility cannot be checked because the database 
 does not contain model metadata. 
 Model compatibility can only be checked for databases created 
 using Code First or Code First Migrations.

我认为这与代码优先迁移尚未创建这些视图的事实有关。事实是,我不能创建这些视图,它们已经存在,我不是dba,我可以(而且必须)只读它们。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

通过在上下文构造函数中将数据库初始化设置为null来终止数据库兼容性检查。

通常的做法是将它放在静态构造函数中:

static ExternalDbContext()
{
    Database.SetInitializer<ExternalDbContext>(null);
}

但它也可以进入默认的公共构造函数

public ExternalDbContext() : base("ExternalDbContext")
{
   Database.SetInitializer<ExternalDbContext>(null);
}