C# 交叉继承的实现与efcore3.0

C# 交叉继承的实现与efcore3.0,c#,.net,entity-framework,inheritance,C#,.net,Entity Framework,Inheritance,我有一个关于“交叉”继承的问题 我们来上几节课吧 public class User { public string UserName { get; set; } public ICollection<Notification> Notifications { get; set; } } public class Notification { public string Message { get; set;} public int Notifica

我有一个关于“交叉”继承的问题

我们来上几节课吧

public class User
{
    public string UserName { get; set; }
    public ICollection<Notification> Notifications { get; set; }
}

public class Notification
{
    public string Message { get; set;}
    public int NotificationType { get; set; }
}
但是正如我们所看到的,
EFUser
有一个
ICollection Notifications
,而不是
ICollection Notifications
,因此,这个模型可以迁移到DB。 据我所知,
virtual
关键字使用不会给我提供解决方案,因为
公共虚拟ICollection通知
不会更改基础类型

有没有办法实现这种结构


本例的主要思想是实现“类的基本结构”,可以通过封装在EF核心对象模型、DTO等中使用。

我建议改为创建一个完全独立的实体类。然后映射到模型类/从模型类映射

公共类EFUser
{
公共Guid Id{get;set;}
公共字符串用户名{get;set;}
公共ICollection通知{get;set;}
}
公共类映射器//或使用自动映射器
{
公共EFUser映射(用户)
{
返回新EFUser
{
UserName=user.UserName,
通知=映射(user.Notifications)
}
}
}

我建议创建一个完全独立的实体类。然后映射到模型类/从模型类映射

公共类EFUser
{
公共Guid Id{get;set;}
公共字符串用户名{get;set;}
公共ICollection通知{get;set;}
}
公共类映射器//或使用自动映射器
{
公共EFUser映射(用户)
{
返回新EFUser
{
UserName=user.UserName,
通知=映射(user.Notifications)
}
}
}

这看起来是泛型的一个很好的用例

public class User<TNotification> where TNotification : Notification {
    public string UserName { get; set; }
    public ICollection<TNotification> Notifications { get; set; }
}
拥有泛型基类现在允许

public class EFUser : User<EFNotification> {
    public Guid Id { get; set; }
}
公共类EFUser:User{
公共Guid Id{get;set;}
}

这意味着
EFUser
现在将具有
ICollection Notifications
属性。

这看起来是泛型的一个很好的用例

public class User<TNotification> where TNotification : Notification {
    public string UserName { get; set; }
    public ICollection<TNotification> Notifications { get; set; }
}
拥有泛型基类现在允许

public class EFUser : User<EFNotification> {
    public Guid Id { get; set; }
}
公共类EFUser:User{
公共Guid Id{get;set;}
}

这意味着
EFUser
现在将有一个
ICollection Notifications
属性。

我知道这个解决方案,我想扩展/改进它,因为我需要为项目中类之间的每个桥接编写映射(例如,请求和响应类等)。此外,对于深层继承结构,它应该使用巨大的开销。我知道这个解决方案,并且我想扩展/改进它,因为我需要为项目中类之间的每个桥接编写映射(例如,请求和响应类等)。此外,它还应该为深层继承结构使用巨大的开销。即使可以这样做,也会在您的数据模型和域模型(我猜是这样)之间创建紧密耦合。完全不推荐。将它们分开并使用映射。即使可以这样做,也会在数据模型和域模型(我想是这样)之间创建紧密耦合。完全不推荐。将它们分开并使用映射。非常感谢!这就是我一直在寻找的解决方案!使用紧密耦合是一个明智的决定,因为我可以将域模型和数据传输模型连接在同一个基础上,并通过fluent api或Map.Ignore实现模型调优。当然,领域模型和数据传输模型通过AutoMapper连接在一起。所以,对基本类的每次修改都会自动更改域模型和数据传输模型之间的所有派生类和映射。希望,我把我的想法解释清楚了。非常感谢!这就是我一直在寻找的解决方案!使用紧密耦合是一个明智的决定,因为我可以将域模型和数据传输模型连接在同一个基础上,并通过fluent api或Map.Ignore实现模型调优。当然,领域模型和数据传输模型通过AutoMapper连接在一起。所以,对基本类的每次修改都会自动更改域模型和数据传输模型之间的所有派生类和映射。希望,我清楚地解释了我的想法。