簡體   English   中英

如何首先使用實體​​代碼和狀態模式映射抽象類

[英]How to map abstract class using entity code first and State Pattern

我正在嘗試使用 Entity Framwork 4.1、Code First 和 Fluent API 映射一個實體。 我的場景是我正在使用抽象類實現狀態模式。 看我的實現:

//我的合同

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”無效。 鍵的所有部分都必須不可為空。

任何人都可以幫助我嗎?

謝謝,

最好的祝福。

米歇爾·馬加良斯

您正在嘗試使用主鍵列作為鑒別器。 這不受支持。 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));         
    }
}

暫無
暫無

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

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