我有一个情况,我需要区分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对象的命令处理程序.

如果我想更新ContactEmailAddressContactPhoneNumber,甚至BusinessNameIndividualName都没有问题,因为对象的类型是正确的.

但是,如果用户想要将对象从CorporateCustomer改为IndividualCustomer或反之亦然.从根本上说,我需要完成的是更改CustomerType,清空未使用的"name"字段,填充已使用的字段并存储它.

我相信这就是abstract和/或virtual种方法的用武之地,但如果可能的话,可能需要一些帮助.

推荐答案

直接回答你的问题,你不能这样做.或者,我认为这是一种应该问问这里的目标是什么的情况.

EF确实允许您拥有这种共享映射,尽管它似乎并没有为您的情况带来最佳效果.考虑到这一点,我认为最好切换到多表解决方案,在该解决方案中,您将共享信息放在CUSTOMER表中,然后与其他COMPANY_CUSTOMER或INDIVIDUAL_CUSTOMER表连接.当你想执行切换时,你可以简单地删除表中的值,并在另一个表中添加一个条目.

从技术上讲,这将使给定客户的每个类型都有一个条目成为可能,但使用良好的业务规则可以很容易地减轻这一问题.

正如前面提到的,这是一个不同的解决方案,可以让您达到相同的目的.对你的问题的直接回答是,你不能做你正在寻找的事情.

Csharp相关问答推荐

自定义JsonEditor,用于将SON序列化为抽象类

为什么在GuardationRule的收件箱函数中,decode.TryParse(valueString,out valueParsed)在给出1.0.1时返回true?

当打印一行x个项目时,如何打印最后一行项目?

将委托传递到serviceccollection c#web API

使用客户端密钥为Fabric Rest API生成令牌

如何使用XmlSerializer反序列化字符串数组?

实体框架核心上是否支持使用NPGSQL的字符串聚合?

在实时数据库中匹配两个玩家的问题

JsonSerializer.Deserialize<;TValue>;(String,JsonSerializerOptions)何时返回空?

最新的Mediatr和具有同步方法的处理程序Handle:并非所有代码路径都返回值"

为什么@rendermode Interactive Auto不能在.NET 8.0 Blazor中运行?

在DoubleClick上交换DataGridViewImageColumn的图像和工具提示

在Docker容器中运行API项目时,无法本地浏览到index.html

Blazor Fluent UI DialogService,<;FluentDialogProvider/>;错误

C#中COM对象的实际地址

在C#和HttpClient中使用REST API

除非首先访问使用的终结点,否则本地API上的终结点不起作用

我什么时候不应该在Dispose中调用EgSuppressFinalize(This)?

自定义ConsoleForMatter中的DI/Http上下文

异步等待,如何在Windows窗体中使用它们?