Трудности, определяющие отношения для архивных данных - PullRequest
0 голосов
/ 04 апреля 2019

Короче говоря; нам нужен кеш, который имеет связанные сущности. Затем мы также должны сохранить просроченные товары в отдельной таблице для соблюдения требований и архивирования.

Представьте себе следующие четыре класса:

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.

В настоящее время, как я вижу, у меня есть три варианта, мне не нравится ни один из них:

  1. Определить оба идентификатора для сущности (мне не нравится эта опция, потому что я не хочу загромождать сущность двумя идентификаторами: которые в конце указывают на один и тот же объект, только в разных таблицах / временах)
  2. Пропустите отношение ArchivedCache и дайте администратору побеспокоиться об этом, поскольку именно он специально запросил это.
  3. Я мог удалить абстрактный класс, в результате чего получилась одна таблица с дискриминатором, но администратор настоял на двух таблицах.

Но прежде чем сделать что-либо, я хотел проверить, есть ли в EF Core что-то такое, что позволило бы это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...