C# - 从基类更新子类

问题描述 投票:0回答:1

我遇到一种情况,我需要区分不同“类型”的

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
方法的用武之地,但如果可能的话可以使用一些帮助。

c# abstract-class
1个回答
0
投票

要直接回答你的问题,你不能这样做。另外,我认为在这种情况下应该问这里的目标是什么。

EF 确实允许您拥有此共享映射,尽管您似乎并未根据您的情况从中获得最佳效果。鉴于此,我认为建议您切换到多表解决方案,在该解决方案中,您在 CUSTOMER 表中拥有共享信息,然后与其他 COMPANY_CUSTOMER 或 INDIVIDUAL_CUSTOMER 表联接。当您想要执行切换时,您只需删除表中的值并在另一个表中添加一个条目即可。

从技术上讲,这将使给定的客户可以为每种类型拥有一个条目,但通过良好的业务规则,这可以很容易地缓解。

如前所述,这是一个不同的解决方案,但可以让您达到相同的目的。您问题的直接答案是您无法做您正在寻找的事情。

© www.soinside.com 2019 - 2024. All rights reserved.