1

我正在尝试使用 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”无效。密钥的所有部分都必须不可为空。

任何人都可以帮助我吗?

谢谢,

此致。

米歇尔·马加良斯

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 回答