Короче говоря; нам нужен кеш, который имеет связанные сущности. Затем мы также должны сохранить просроченные товары в отдельной таблице для соблюдения требований и архивирования.
Представьте себе следующие четыре класса:
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; }
}
Затем он использовался для сохранения исходного идентификатора, чтобы определить отношение к сущности. Затем я попытался удалить это, добавив ValueGeneratedOnAdd () и присвоив ему тот же идентификатор, что и для AvailableCache.
Проблема в том, что при попытке вставить сущность ограничение внешнего ключа не разрешит его, так как оно не существует в этой таблице.
Поскольку AvailableCache и ArchivedCache - это в основном один и тот же объект, я бы хотел сохранить простые отношения с Entity.
В настоящее время, как я вижу, у меня есть три варианта, мне не нравится ни один из них:
- Определить оба идентификатора для сущности (мне не нравится эта опция, потому что я не хочу загромождать сущность двумя идентификаторами: которые в конце указывают на один и тот же объект, только в разных таблицах / временах)
- Пропустите отношение ArchivedCache и дайте администратору побеспокоиться об этом, поскольку именно он специально запросил это.
- Я мог удалить абстрактный класс, в результате чего получилась одна таблица с дискриминатором, но администратор настоял на двух таблицах.
Но прежде чем сделать что-либо, я хотел проверить, есть ли в EF Core что-то такое, что позволило бы это.