1

Entity Framework 5 Code First でステータス パターンを実装しようとしています。

私のシナリオには、LotStatus という名前の抽象部分基本クラスと、このクラスから継承する 5 つのクラスがあります: OpenStatus、AwardedStatus、CancelledStatus、ContractSignedStatus、および EvaluationStatus:

    public abstract partial class LotStatus { ... }

    public class OpenStatus : LotStatus { ... }
    public class AwardedStatus : LotStatus { ... }

DBContext からの OnModelCreating では、モデル ビルダーに構成を追加して、これらのエンティティをマップします。

    modelBuilder.Configurations.Add(new LotStatusConfiguration());

LotStatusConfiguration のコードは次のとおりです。

    public class LotStatusConfiguration : EntityTypeConfiguration<LotStatus>
    {
        public LotStatusConfiguration()
        {
            ToTable("LotStatus");
            HasKey(ls => ls.LotStatusID);

            this.Map<OpenStatus>(pk => pk.Requires("Discriminator").HasValue(typeof(OpenStatus).AssemblyQualifiedName).HasColumnType("nvarchar(max)"));
            this.Map<EvaluationStatus>(pk => pk.Requires("Discriminator").HasValue(typeof(EvaluationStatus).AssemblyQualifiedName).HasColumnType("nvarchar(max)"));
            this.Map<AwardedStatus>(pk => pk.Requires("Discriminator").HasValue(typeof(AwardedStatus).AssemblyQualifiedName).HasColumnType("nvarchar(max)"));
            this.Map<ContractSignedStatus>(pk => pk.Requires("Discriminator").HasValue(typeof(ContractSignedStatus).AssemblyQualifiedName).HasColumnType("nvarchar(max)"));
            this.Map<CancelledStatus>(pk => pk.Requires("Discriminator").HasValue(typeof(CancelledStatus).AssemblyQualifiedName).HasColumnType("nvarchar(max)"));
        }
    }

EF がデータベースを作成しようとすると、エラーが発生します。

    The type 'OpenStatus' was not mapped. Check that the type has not been explicitly excluded by using the Ignore method or NotMappedAttribute data annotation. Verify that the type was defined as a class, is not primitive, nested or generic, and does not inherit from EntityObject.

[NotMapped] タグがないので、何をしているの? アイデア?

ありがとう!

4

2 に答える 2

1

解決しました!

このプロジェクトで定義された別のステータス パターンがあります。問題は、実装されている他のステータス パターンに、別の抽象クラス (ProcedureStatus) を継承する別の OpenStatus クラスが存在するためです。

Core.ProcedureAggregate.OpenStatus : ProcedureStatus
Core.LotAggregate.OpenStatus : LotStatus

ステータスの名前を OpenLotStatus に変更したところ、うまくいきました...

Core.ProcedureAggregate.OpenStatus : ProcedureStatus
Core.LotAggregate.OpenLotStatus : LotStatus

異なる名前空間で定義されていても、同じ名前の 2 つのクラスを持つことはできないようです...

全てに感謝 :)

于 2013-04-29T09:39:30.687 に答える
0

エンティティをに含めるのを忘れたようですDbContext- 例

public DbSet<LotStatus> LotStatuses { get; set; }  

詳細については、これを参照してくださいEntity Not Mapped - Entity Model Framework

于 2013-04-26T12:43:59.403 に答える