1

環境:

モデルとデータベース間の接続としてEF5を使用しています。私のソリューションには次のレイヤーがあります。

  • 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} = {"モデルの生成中に 1 つ以上の検証エラーが検出されました:\r\n\r\n\tSystem.Data.Entity.Edm.EdmEntityType: : EntityType ' AnnualPeriodMap' にはキーが定義されていません。この EntityType のキーを定義してください。\r\n\tSystem.Data.Entity.Edm.EdmEntitySet: EntityTy...

私のモデル クラスはできる限り基本的なものですが、冗長なコードを入力しないようにするために、一部のモデル クラスは、単に Id プロパティを保持するEntityBaseと呼ばれるクラスから継承します。以下は、このクラスのコードです。

/// <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 (of long)から継承しています。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 マッピングは、(ModelClass の) EntityTypeConfigurationクラスを介して行われます。以下にそのようなマッピングの例を示します。

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 さん、アドバイスありがとうございます。

4

3 に答える 3

1

Custom Conventions を使用した EF6 では、これを回避する方法があるようです。[ http://channel9.msdn.com/Events/TechEd/NorthAmerica/2013/DEV-B335#fbid=yJPWH45LEuw ] (トークの 00:20:00 頃) を参照してください。

于 2013-06-19T11:21:15.853 に答える
0

キー属性を記載してください

名前空間: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; }
 }
于 2013-06-12T11:18:24.033 に答える