我是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();
}
答案 0 :(得分:0)
代码优先约定将查找要用作密钥的ID
或InvoiceID
属性。您的Invoice
模型既没有,也有其他模型。这是您的代码失败的具体原因。
不太具体的一个是你不能在EF中拥有缺少唯一键的实体。如果可以,请让视图定义一个键。否则,您仍然可以work around the issue。