我遇到一种情况,我需要区分不同“类型”的
Customer
对象。
即:
public abstract class Customer
{
protected Customer(string customerType, string emailAddress, string phoneNUmber)
{
Type = customerType;
ContactEmail = emailAddress;
ContactPhone = phoneNUmber;
}
public string ContactEmail { get; private set; }
public string ContactPhone { get; private set; }
}
internal class CorporateCustomer : Customer
{
public CorporateCustomer(string customerType, string emailAddress, string phoneNumber, string businessName) : base(customerType, emailAddress, phoneNumber)
{
BusinessName = businessName;
}
public BusinessName BusinessName { get; private set; }
}
internal class IndividualCustomer : Customer
{
public IndividualCustomer(string customerType, string emailAddress, string phoneNumber, string individualName) : base(customerType, emailAddress, phoneNumber)
{
IndividualName = individualName;
}
public string IndividualName { get; private set; }
}
我正在使用 ASP.NET EF Core 并在我的属性配置中包含此内容:
builder
.HasDiscriminator(x => x.CustomerType)
.HasValue<CorporateCustomer>("CORPORATE")
.HasValue<IndividualCustomer>("INDIVIDUAL");
因此,该对象可以作为个人客户或公司客户正确地从数据库中出来。
我正在编写一个想要更新
Customer
对象的命令处理程序。
如果我想更新
ContactEmailAddress
或 ContactPhoneNumber
甚至 BusinessName
或 IndividualName
没问题,因为对象是正确的类型。
但是,如果用户想要将对象从
CorporateCustomer
更改为 IndividualCustomer
,反之亦然。从根本上来说,我需要完成的是更改 CustomerType
,清空未使用的“名称”字段,然后填充并存储它。
我相信这就是
abstract
和/或 virtual
方法的用武之地,但如果可能的话可以使用一些帮助。
要直接回答你的问题,你不能这样做。另外,我认为在这种情况下应该问这里的目标是什么。
EF 确实允许您拥有此共享映射,尽管您似乎并未根据您的情况从中获得最佳效果。鉴于此,我认为建议您切换到多表解决方案,在该解决方案中,您在 CUSTOMER 表中拥有共享信息,然后与其他 COMPANY_CUSTOMER 或 INDIVIDUAL_CUSTOMER 表联接。当您想要执行切换时,您只需删除表中的值并在另一个表中添加一个条目即可。
从技术上讲,这将使给定的客户可以为每种类型拥有一个条目,但通过良好的业务规则,这可以很容易地缓解。
如前所述,这是一个不同的解决方案,但可以让您达到相同的目的。您问题的直接答案是您无法做您正在寻找的事情。