1

Entity Framwork 4.1、Code First、FluentAPIを使用してエンティティをマッピングしようとしています。私のシナリオは、抽象クラスを使用して状態パターンを実装していることです。私の実装を参照してください:

//私の契約

public abstract class SaleStatus
{
        public int IdSaleStatus { get; set; }
        public string Description { get; set; }

        public abstract void ChangeTo(Sale sale, SaleStatus saleStatus);
}

public class SaleStatusBooked : SaleStatus
{
        public SaleStatusBooked()
        {
            this.IdSaleStatus = 1;
            Description = "Reservado";
        }

        public override void ChangeTo(Sale sale, SaleStatus newStatus)
        {
            if (!(newStatus is SaleStatusPaid) || (!(newStatus is SaleStatusTimeOut)))
                throw new BusinessException("salestatus");

            sale.SetStatus(newStatus);
        }
}

    public class SaleStatusPaid : SaleStatus
    {
        public SaleStatusPaid()
        {
            this.IdSaleStatus = 2;
            Description = "Pago";
        }

        public override void ChangeTo(Sale sale, SaleStatus newStatus)
        {
            if (!(newStatus is SaleStatusCancelled) || (!(newStatus is SaleStatusNotResolved)) || (!(newStatus is SaleStatusCriticalError)))
                throw new BusinessException("salestatus");

            sale.SetStatus(newStatus);
        }
    }

そして今、SaleStatusの私の現在のマッピング:

    public class SaleStatusMap: EntityTypeConfiguration<SaleStatus>
    {
        public SaleStatusMap()
        {
            ToTable("SaleStatus");
            HasKey(ss => ss.IdSaleStatus);

            Map<SaleStatusBooked>(pk => pk.Requires("IdSaleStatus").HasValue(1));                
            Map<SaleStatusPaid>(pk => pk.Requires("IdSaleStatus").HasValue(2));         
        }
    }

プロジェクトを実行すると、次のメッセージが表示されます。

指定されたスキーマが無効です。エラー:(107,6):エラー0075:キーパーツ:タイプSaleStatusの「IdSaleStatus」が無効です。キーのすべての部分はnull許容でない必要があります。

誰でも私を助けることができますか?

ありがとう、

よろしくお願いします。

ミシェル・マガリャエス

4

1 に答える 1

4

主キー列を識別子として使用しようとしています。これはサポートされていません。EFでは、ディスクリミネーター列をプロパティとしてマップすることはできません(新しい派生型を保存するときに、EFは内部で正しいディスクリミネーター値を割り当てます)

できることはSaleStatus、ディスクリミネーター値を格納するためにテーブルに別の列を作成することです。

public class SaleStatusMap: EntityTypeConfiguration<SaleStatus>
{
    public SaleStatusMap()
    {
        ToTable("SaleStatus");
        HasKey(ss => ss.IdSaleStatus);

        Map<SaleStatusBooked>(pk => pk.Requires("StatusType").HasValue(1));                
        Map<SaleStatusPaid>(pk => pk.Requires("StatusType").HasValue(2));         
    }
}
于 2011-08-28T01:11:10.970 に答える