2012-02-28 85 views
1

我收到以下错误,而使用POCO实体宽度EF模型生成过程中检测到EF代码第一个问题NO关键字中定义

一个或多个验证错误: System.Data.Edm.EdmEntityType:的EntityType“品牌'没有定义关键字 。定义此EntityType的关键字。 System.Data.Edm.EdmEntitySet:EntityType:EntitySet'Brand'基于 ,其类型'Brand'没有定义键。

POCO

public class Brand 
    { 
     //[Key] 
     public int BrandId { get; set; } 
     public String BrandName { get; set; } 
     public String CompanyName { get; set; } 
     public Int32 CountryId { get; set; } 
     public String Description { get; set; } 
    } 

DBConetxt

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


     public DbSet<Brand> Brand { get; set; } 
     public DbSet<Country> Country { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<Brand>().ToTable("dbo.Brand"); 
      modelBuilder.Entity<Country>().ToTable("dbo.Country"); 
      base.OnModelCreating(modelBuilder); 
     } 
    } 

DB表

BrandId int 
BrandName varchar 
CompanyName varchar 
CountryId int 
Description varchar 
CreatedBy int 
CreatedDate datetime 
ModifiedBy int 
ModifiedDate datetime 

使用

DBContext o = new DBContext(); 
return o.Brand.ToList(); 

如果[Key]注释与POCO一起使用来指示pk,那么它工作正常,但我不想在POCO中使用任何依赖类。

任何建议???

谢谢

+0

再次,品牌具有Country表的FK属性。使用MVC创建新品牌时,我需要显示国家列表作为下拉列表。请建议我最好的方法来创建品牌实体以实现这种情景? – Paul 2012-02-28 14:33:51

+0

您使用的是什么版本的实体框架?如果您使用4.1+(http://msdn.microsoft.com/en-us/library/hh161541(v=vs.103).aspx) – 2012-02-28 15:03:27

回答

2

您可以使用流畅的API配置PK。您不必显式指定数据库模式为dbo

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Brand>().ToTable("Brand"); 
     modelBuilder.Entity<Brand>().HasKey(b => b.BrandId); 

     modelBuilder.Entity<Country>().ToTable("Country"); 
     base.OnModelCreating(modelBuilder); 
    } 

您还可以在Brand POCO定义的导航属性Country

public class Brand 
{ 
    public int BrandId { get; set; } 
    public String BrandName { get; set; } 
    public String CompanyName { get; set; } 
    public Int32 CountryId { get; set; } 

    public virtual Country Country {get; set; } 

    public String Description { get; set; } 
} 

Action方法

public ActionResult Create() 
    { 
     ViewData["Countries"] = new SelectList(db.Country.ToList(), 
       "CountryId", "CountryName"); 

     return View(); 
    } 

如果是视图

@Html.DropDownListFor(model => model.CountryId, 
      (IEnumerable<SelectListItem>)ViewData["Countries"], "-") 
+0

感谢Eranga,BrandId应该被视为您的关键。你的解决方案已经奏效Eranga,EF做所有动态映射类的东西。它会造成性能开销?你可以在使用EF时建议一些性能改进提示吗? – Paul 2012-02-28 15:42:44

+0

@Paul开销只有一次操作。你**的开销**不是基于事实。测试是否有显着的开销。 – Eranga 2012-02-28 15:48:11