Child class 实例化,自动为我设置鉴别器 属性 (Code First)

Child class instantiation, automatically set the discriminator property for me (Code First)

我有父摘要class:

public abstract class Transaction
{
    public int ID { get; set; }
    public string TransactionDescr { get; set; }
    public DateTime TransactionDate { get; set; }        
    public int TransactionType { get; protected set; }
}

还有一些我想在实例化时设置 TransactionType 属性 的真实子 classes。

在我的数据库中,我有一个 TransactionType 列用作鉴别器。

这是我的想法:

public class TransactAdd : Transaction
{
    public TransactAdd()
    {
        TransactionType = 1;
    }
}
public class TransactDeduct : Transaction
{
    public TransactDeduct()
    {
        TransactionType = 2;
    }
}
public class TransactTransfer : Transaction
{
    public TransactTransfer()
    {
        TransactionType = 3;
    }
}

在 class 构造函数中设置 TransactionType 是个好主意吗?我对吗?或者有更好的方法吗?

顺便说一下,最后,我使用 Dapper 将 parent class Transaction 保存在数据库中。

我添加了解决方案,感谢@flobjective

更新(解决方案)

public abstract class Transaction
{
    public int ID { get; set; }
    public string TransactionDescr { get; set; }
    public DateTime TransactionDate { get; set; }        
    public abstract int TransactionType { get; }
}

public class TransactAdd : Transact
{
    public override int TransactType
    {
        get
        {
            return 1;
        }
    }
}
public class TransactDeduct : Transact
{
    public override int TransactType
    {
        get
        {
            return 2;
        }
    }
}
public class TransactTransfer : Transact
{
    public override int TransactType
    {
        get
        {
            return 3;
        }
    }
}

您的解决方案的一个弱点是您必须记住设置交易类型。如果其他人添加了一个新的交易 class 他可能会忘记,这将导致错误的 TransactionType1.

除此之外 intTransactionType 已保护 setter 这意味着以后有人可能会更改类型,这可能会导致问题。

您可以创建一个抽象方法 (Get)TransactionType 强制每个具体实现 return 一个 int。但是,这仍然不能确保您对所有类型使用唯一的整数。

我认为这可能是适合我的解决方案,但只读数据不会写入数据库,我需要将此数据作为复合键的一部分。现在,如果有一种方法可以将鉴别器用作我的复合键策略的一部分,那将是完美的

Public Overrides ReadOnly Property AddressType As AddressType
    Get
        Return AddressType.Consignee
    End Get
End Property