如何将EF6与Database First和现有视图一起使用?

时间:2013-11-12 17:11:01

标签: c# entity-framework-6

我是EF noob(任何版本),而我的Google-foo在找到如何做到这一点时让我失望。这让我觉得我必须做错了,但情况就是这样:

我肯定是在数据库优先的环境中,我们的编码人员不会更新架构。我也不是'自动'代码生成的粉丝,所以我远离了设计师或EF powertools(虽然我确实试过它们只是为了看它们有效)。

要了解我在创建一些简单的Web API 2端点时将Northwind数据库导入到我的LocalDB中,以便能够使用它。这一切顺利,因为我创建了员工,托运人和&amp ;; Northwind的区域表。地区特别有趣,因为它不是复数,EF有问题。无论如何,我得到了那个。

我现在的麻烦是;我想使用视图而不是表作为我的源代码,而我正在做的事情似乎并不起作用。我尝试过的就是设置它就像我做桌子一样。但是这会产生ModelValidationException错误。我试着查看设计师自动生成的代码,但没有深入了解。

我的模特:

//-- employee, shipper, & region work as expected
public class employee {
    public int EmployeeID { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

public class shipper {
    public int ShipperID { get; set; }
    public string CompanyName { get; set; }
    public string Phone { get; set; }
}

public class region {
    public int RegionID { get; set; }
    public string RegionDescription { get; set; }
}

//-- invoice is a view (actual viewname is 'Invoices')
//-- so i followed the same rules as i did for employee & shipper
//-- i have tried uppercase 'I' as well as a plural version of the model
public class invoice {
    public string CustomerID { get; set; }
    public string CustomerName { get; set; }
    public string Salesperson { get; set; }
    public int OrderID { get; set; }
    public int ProductID { get; set; }
    public string ProductName { get; set; }
}

我的上下文如下所示:

public class NorthwindDBContext : DbContext {
    public DbSet<Employee> Employees { get; set; }
    public DbSet<shipper> Shippers { get; set; }
    public DbSet<region> Regions { get; set; }
    public DbSet<Invoice> Invoices { get; set; } //-- offending line of code

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        //--- fix for Region being singular instead of plural
        modelBuilder.Entity<region>().ToTable("Region");
    }
}

如果我在上下文中注释掉public DbSet<Invoice> Invoices { get; set; }行,一切正常。只是让行存在(即使我没有引用Invoices属性)我在使用上下文时仍会收到ModelValidationException错误。

有谁能告诉我这里我做错了什么? 感谢。

更新:我在我的一个控制器中尝试了这个,但我也不知道这是不是正确的路径,尽管它可以获得记录。

using (var dbContext = new NorthwindDBContext()) {
    return dbContext.Database.SqlQuery<Invoice>("select * from invoices").ToList();
}

1 个答案:

答案 0 :(得分:0)

代码优先约定将查找要用作密钥的IDInvoiceID属性。您的Invoice模型既没有,也有其他模型。这是您的代码失败的具体原因。

不太具体的一个是你不能在EF中拥有缺少唯一键的实体。如果可以,请让视图定义一个键。否则,您仍然可以work around the issue