【问题标题】:EF Code first issue NO KEY DEFINEDEF 代码第一次发布没有定义密钥
【发布时间】:2012-02-28 14:18:33
【问题描述】:

使用 POCO 实体宽度 EF 时出现以下错误

在模型生成过程中检测到一个或多个验证错误: System.Data.Edm.EdmEntityType: : EntityType 'Brand' 没有键 定义。定义此 EntityType 的键。 System.Data.Edm.EdmEntitySet: EntityType: EntitySet '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);
        }
    }

数据库表

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 一起使用。

有什么建议吗???

谢谢

【问题讨论】:

  • 同样,Brand 具有 Country 表的 FK 属性。在使用 MVC 创建新品牌时,我需要将国家/地区列表显示为下拉列表。请建议我创建品牌实体以实现这种情况的最佳方法?
  • 您使用的是哪个版本的实体框架?如果您使用的是 4.1+ (msdn.microsoft.com/en-us/library/hh161541(v=vs.103).aspx),则 BrandId 应按惯例视为您的密钥

标签: entity-framework key poco code-first


【解决方案1】:

您可以使用 fluent 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; }
}

动作方法

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

        return View();
    }

然后在视图中

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

【讨论】:

  • 谢谢埃兰加。您的解决方案已经奏效。 Eranga, EF 动态地做所有映射类型的事情。它会产生性能开销吗?您能否在使用 EF 时提出一些性能改进提示???
  • @Paul 开销只有一次操作。您的开销并非基于事实。测试是否有显着的开销。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
相关资源
最近更新 更多