簡體   English   中英

EF 5.0 Fluent映射:“ EntityType'{ClassMap}'”未定義鍵。 定義此EntityType的密鑰。”

[英]EF 5.0 Fluent mapping: “EntityType '{ClassMap}' has no key defined. Define the key for this EntityType.”

語境:

我正在使用EF5作為MODEL和數據庫之間的連接。 我的解決方案分為以下幾層:

  • Company.Common(包括常見的類和接口);
  • Company.Common.Data.Sql.EF(包括與EF相關的通用類和接口);
  • Company.App.Model(包括應用程序的模型+ IModelRepository類,無需引用EF);
  • Company.App.Data.Sql.EF(包括基於應用程序模型的EF數據庫實現)
  • Company.App.Services(保存服務,該服務使用IModelRepositories等)

問題描述:

我得到的錯誤如下: base {System.Exception} = {“在模型生成期間檢測到一個或多個驗證錯誤:\\ r \\ n \\ r \\ n \\ tSystem.Data.Entity.Edm.EdmEntityType::EntityType'未定義AnnualPeriodMap'鍵。為此EntityType定義鍵。\\ r \\ n \\ tSystem.Data.Entity.Edm.EdmEntitySet:EntityTy ...

我的模型類盡可能地基礎,但是為了幫助自己避免鍵入冗余代碼,一些模型類繼承自我稱為EntityBase的類,該類僅持有Id屬性。 下面是該類的代碼:

/// <summary>
/// Base implementation for IEntity.
/// </summary>
/// <typeparam name="TId">The type of the id.</typeparam>
public abstract class EntityBase<TId> : IEntity<TId>        
{
    public virtual TId Id { get; set; }        
    object IEntity.Id
    {
        get
        {
            return this.Id;
        }
        set
        {
            this.Id = (TId)value;
        }
    }
}

EntityBase本身繼承自Company.Common.Data中定義的IEntity ,這是此接口的代碼:

public interface IEntity
{
    /// <summary>
    /// The entity's id.
    /// </summary>
    object Id { get; set; }
}

/// <summary>
/// Defines an entity.
/// </summary>
/// <typeparam name="TKey">The type of the entity's key.</typeparam>
public interface IEntity<TKey> : IEntity
{
    /// <summary>
    /// The entity's id.
    /// </summary>
    new TKey Id { get; set; }
}

當需要聲明共享相同舊數據的模型實體(例如Id的實體)時,我做了所有這些事情,從而使我的生活更加輕松。下面是我目前遇到問題的模型類的代碼,即AnnualPeriod ,如您所見,繼承自EntityBase(很長) 上面顯示了EntityBase本身,第一個代碼示例...

public class AnnualPeriod : EntityBase<long>
{
    public virtual int AnnualPeriodTypeId { get; set; }
    public virtual AnnualPeriodType AnnualPeriodType { get; set; }
    public virtual string Code { get; set; }
    public virtual DateTime StartDate { get; set; }
    public virtual DateTime EndDate { get; set; }

    public virtual ICollection<Counter> Counters { get; set; }
}

我的EF映射是通過EntityTypeConfiguration(屬於ModelClass)類完成的,下面是此類映射的示例:

public class AnnualPeriodMap : EntityTypeConfiguration<AnnualPeriod>
{
    public AnnualPeriodMap()
    {
        // Table
        this.ToTable("AnnualPeriods");

        // Primary Key
        this.HasKey(e => e.Id);

        // Columns
        this.Property(e => e.Id).HasColumnName("id");
        this.Property(e => e.AnnualPeriodTypeId).HasColumnName("annualPeriodTypeId");
        this.Property(e => e.Code).HasColumnName("code");
        this.Property(e => e.StartDate).HasColumnName("startDate");
        this.Property(e => e.EndDate).HasColumnName("endDate");
    }
}

現在,在執行代碼時,我體驗到EF5表示EntityType'AnnualPeriodMap'沒有定義鍵。 定義此EntityType的鍵 我不明白我在做什么錯,因為我清楚地在我的AnnualPeriodMap (EntityTypeConfiguration)類中聲明了代碼this.HasKey(e => e.Id)

很明顯,我在配置上或者在不了解EF如何正常工作方面都做錯了。 但是我還沒有在互聯網上找到關於建立這樣的建築的任何信息...

預先感謝您的建議,Yves Schelpe

似乎在EF6中使用自定義約定可以解決此問題。 請參閱[ http://channel9.msdn.com/Events/TechEd/NorthAmerica/2013/DEV-B335#fbid=yJPWH45LEuw ](在演講的00:20:00左右)。

請提及密鑰屬性

名稱空間:使用System.ComponentModel.DataAnnotations使用;

 public class AnnualPeriod : EntityBase<long>
 {
[Key]
public virtual int AnnualPeriodTypeId { get; set; }
public virtual AnnualPeriodType AnnualPeriodType { get; set; }
public virtual string Code { get; set; }
public virtual DateTime StartDate { get; set; }
public virtual DateTime EndDate { get; set; }

public virtual ICollection<Counter> Counters { get; set; }
 }

對我來說,解決方案是將EntityTypeConfiguration添加到DbContext初始化中。 我已經正確聲明了DbSet,但是由於未知的原因,我完全忘記了對其進行配置! 就像是:

public IDbSet<AnnualPeriod> AnnualPeriods { get; set; }

void OnModelCreating(DbModelBuilder modelBuilder){
   ....
   //I was missing this line
   modelBuilder.Configurations.Add(new AnnualPeriodMap ());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM