子类实例化,自动为我设置鉴别器属性(代码优先)

时间:2017-03-29 08:11:52

标签: c# inheritance code-first instantiation discriminator

我有一个父抽象类:

$path = "C:\Batch\Output\WarehousingControl\WarehousingControl.csv"
$path = $path.Replace(".csv", "_" + (Get-Date -f "yyy-MM-dd") + ".csv")

$ds.Tables[0] | 
    Export-csv -delimiter ";" -path "C:\temp\TempWarehousingControl.csv" -NoTypeInformation -Force -Encoding UTF8 

Get-Content C:\temp\TempWarehousingControl.csv | 
    %{ $_ -replace """""", "NULL"} |
    %{ $_ -replace """", ""} | 
    Out-File -FilePath $path -Force -Encoding utf8

我想在实例化时设置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列,我将其用作鉴别器。

这是我的想法:

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; } } 是个好主意吗?我对吗?还是有更好的方法?

顺便说一句,最后,我使用Dapper将父类TransactionType 保存在数据库中。

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

UPDATE(溶液)

Transaction

2 个答案:

答案 0 :(得分:1)

您的解决方案的一个弱点是您必须记住设置事务类型。如果其他人添加了新的Transaction类,他可能会忘记,这会导致TransactionType的{​​{1}}值错误。

除此之外1已经保护了setter,这意味着某人以后可能会改变可能导致问题的类型。

您可以创建一个抽象方法intTransactionType,强制每个具体实现返回一个int。但是,仍然无法确保为所有类型使用唯一的整数。

答案 1 :(得分:0)

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

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