简而言之;我们需要一个缓存,该缓存具有相关的实体。然后,出于合规性和存档原因,我们还需要将过期的项目存储在单独的表中。
想象一下以下四个类:
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的关系保持简单。
目前看来,我有三个选择,但我不喜欢其中任何一个:
但是在我做任何一项之前,我都想检查一下EF Core中是否有某些东西可以允许这样做。