Как отобразить абстрактный класс, используя сначала код сущности и State Pattern - PullRequest
1 голос
/ 28 августа 2011

Я пытаюсь сопоставить сущность, используя 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: ключ Часть: 'IdSaleStatus' для типа SaleStatus недопустима. Все части ключ должен быть не обнуляемым.

Кто-нибудь может мне помочь?

Спасибо

С наилучшими пожеланиями.

Мишель Магальес

1 Ответ

3 голосов
/ 28 августа 2011

Вы пытаетесь использовать столбец первичного ключа в качестве дискриминатора.Это не поддерживается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));         
    }
}
...