asp.net 将派生类保存到EF Core中的单个表中,并支持运行时加载

jrcvhitl  于 2023-02-01  发布在  .NET
关注(0)|答案(1)|浏览(131)

我有一些自定义类,如BarcodeDeviceLightDevice,它们是从一个名为Device的基类派生而来的。
1.将所有定制类保存到一个表中,即Device表。
1.根据类(设备)的功能,每个自定义类可能包含不同的属性。
1.有些自定义类已经和项目一起加载了,而其他的将在以后创建并以某种方式加载,例如通过上传Dll文件。因此,一旦项目上线,代码就不能更改。
1.可以通过使用DbContext从数据库加载Device对象来检索各个定制类。
我现在使用的是Discriminator,它可以工作,但是它只运行一次,因此不支持在运行时添加自定义类。我该如何解决这个问题?
DbContext

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    public DbSet<Device> Devices { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // Configure device type for each type.
        modelBuilder.Entity<BarcodeDevice>()
            .HasDiscriminator(p => p.Type)
            .HasValue(nameof(BarcodeDevice));
        
        modelBuilder.Entity<LightDevice>()
            .HasDiscriminator(p => p.Type)
            .HasValue(nameof(LightDevice));
    }
}

自定义类:

public class BarcodeDevice : Device
{
    [Required]
    public string Type { get; set; }
    
    private SerialPort serial { get; set; }
    private string barcodeValue { get; set;}
    
    // other properties
}

服务:

public class DeviceService : IDeviceService
{
    // Some variables
    
    public DeviceService(IServiceScopeFactory serviceScopeFactory)
    {
        _serviceScopeFactory = serviceScopeFactory;
        var dbContext = _serviceScopeFactory.CreateScope()
            .ServiceProvider.GetRequiredService<ApplicationDbContext>();

        Devices = dbContext.Devices.ToList();

        for (int i = 0; i < Devices.Count; i++)
        {
            Devices[i].StartInstance();
            Devices[i].OnMessageSend += Device_OnMessageSend;
        }

        _mqttClient = _serviceScopeFactory.CreateScope()
            .ServiceProvider.GetRequiredService<IResolverMqttClient>();

        _mqttClient.OnMqttMessageReceived += MqttClient_OnMqttMessageReceived;
    }
    
    // some methods
}
llycmphe

llycmphe1#

你的选择。
1.回到3)。你真的需要这个吗?
1.别用EF,

1.只Map了一个JSON列来存储每种设备类型的不同属性。

相关问题