定义存档数据关系的困难

时间:2019-04-04 08:01:45

标签: sql-server entity-framework asp.net-core entity-framework-core

简而言之;我们需要一个缓存,该缓存具有相关的实体。然后,出于合规性和存档原因,我们还需要将过期的项目存储在单独的表中。

想象一下以下四个类:

public abstract class Cache
{
    public int Id { get; set; }
    public Cache() 
    {
        Entities = new HashSet<Entity>();
    }
    public ICollection<Entity> Entities { get; set; }
}

public class AvailableCache : Cache
{

}

public class ArchivedCache : Cache
{

}

public class Entity
{
    public int Id { get; set; }
    public int? CacheId { get; set; }
    public AvailableCache { get; set; }
    public ArchivedCache { get; set; }
}

连同以下 DbContext

public partial class DbCacheContext : DbContext
{
    public virtual DbSet<AvailableCache> { get; set; }
    public virtual DbSet<ArchivedCache> { get; set; }
    public virtual DbSet<Entity> Entities { get; set; }

    protected override void OnModelCreatning(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ArchivedCache>(p => 
        {
            p.Property(p => p.Id)
            .ValueGeneratedOnAdd();

            p.HasMany(p => p.Entities).WithOne(p => p.ArchivedCache).HasForeignKey(p => p.CacheId);
        }

        modelBuilder.Entity<AvailableCache>(p => 
        {
            p.HasMany(p => p.Entites).WithOne(p => p.AvailableCache).HasForeignkey(p => p.CacheId);
        }
}

一个定期作业将填充高速缓存,检查过期项并将其存档。首次尝试将一列添加到ArchivedCache

public class ArchivedCache : Cache
{
    public int OriginalId { get; set; }
}

然后将其用于保存原始ID,以定义与Entity的关系。然后,我尝试将其删除,添加ValueGeneratedOnAdd()并为其提供与AvailableCache相同的ID。

问题是,当尝试插入实体时,外键约束将不允许它,因为该表中不存在外键约束。

由于AvailableCache和ArchivedCache基本上是相同的对象,所以我想使对Entity的关系保持简单。

目前看来,我有三个选择,但我不喜欢其中任何一个:

  1. 在Entity上定义两个ID(我不喜欢此选项,因为我不想使具有两个ID的Entity杂乱无章,它们最终指向同一对象,只是在不同的表/时间)
  2. 跳过ArchivedCache关系,让DBA担心,因为他是特别要求这样做的人。
  3. 我可以删除抽象类,从而在一个表中添加一个鉴别符,但DBA坚持使用两个表。

但是在我做任何一项之前,我都想检查一下EF Core中是否有某些东西可以允许这样做。

0 个答案:

没有答案