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 他可能会忘记,这将导致错误的 TransactionType
值 1
.
除此之外 intTransactionType
已保护 setter 这意味着以后有人可能会更改类型,这可能会导致问题。
您可以创建一个抽象方法 (Get)TransactionType
强制每个具体实现 return 一个 int。但是,这仍然不能确保您对所有类型使用唯一的整数。
我认为这可能是适合我的解决方案,但只读数据不会写入数据库,我需要将此数据作为复合键的一部分。现在,如果有一种方法可以将鉴别器用作我的复合键策略的一部分,那将是完美的
Public Overrides ReadOnly Property AddressType As AddressType
Get
Return AddressType.Consignee
End Get
End Property
我有父摘要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 他可能会忘记,这将导致错误的 TransactionType
值 1
.
除此之外 intTransactionType
已保护 setter 这意味着以后有人可能会更改类型,这可能会导致问题。
您可以创建一个抽象方法 (Get)TransactionType
强制每个具体实现 return 一个 int。但是,这仍然不能确保您对所有类型使用唯一的整数。
我认为这可能是适合我的解决方案,但只读数据不会写入数据库,我需要将此数据作为复合键的一部分。现在,如果有一种方法可以将鉴别器用作我的复合键策略的一部分,那将是完美的
Public Overrides ReadOnly Property AddressType As AddressType
Get
Return AddressType.Consignee
End Get
End Property