Вложенные дженерики с ядром EFC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Вложенные дженерики с ядром EF

Сообщение Anonymous »

Мой вопрос: есть ли способ использовать вложенные дженерики в качестве дискриминаторов для сопоставлений таблиц EF
У меня есть репозиторий здесь: https://github.com/sebastianwhiffen/Generically- Typed-Entities-with-EF-Core, демонстрирующий использование универсальных шаблонов в качестве своего рода «дискриминатора» для сопоставления таблиц. Но НЕ вложенные дженерики
в Program.cs, продукт того, что я написал, создает краткий API:

Код: Выделить всё

//gets all clients
repo.Get().OfType().ToList().ForEach(x => Console.WriteLine(x.GetDisplayName()));

//gets individuals from the DB
repo.Get().OfType().ToList().ForEach(x => Console.WriteLine(x.GetDisplayName()));

//gets companies
repo.Get().OfType().ToList().ForEach(x => Console.WriteLine(x.GetDisplayName()));

//you get the idea
repo.Get().OfType().ToList().ForEach(x => Console.WriteLine(x.GetDisplayName()));

контекст БД выглядит так

Код: Выделить всё

public class MyDB : DbContext
{
public MyDB(DbContextOptions options) : base(options){}

public DbSet Clients { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.MapClientTypes();
}
}
и я могу сопоставить типы клиентов с помощью отражения (чтобы избежать большого количества ручного труда в реальном приложении, где может быть куча типов)

Код: Выделить всё

public static class ModelBuilderHelper
{
public static void MapClientTypes(this ModelBuilder modelBuilder)
{
var clientTypes = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(t => t.IsClass && !t.IsAbstract && typeof(IClient).IsAssignableFrom(t))
.ToList();

foreach (var clientType in clientTypes)
{
var genericClientType = typeof(Client).MakeGenericType(clientType);
var entityTypeBuilder = modelBuilder.Entity(genericClientType);
var dataProperty = genericClientType.GetProperty("Data");
entityTypeBuilder.OwnsOne(dataProperty.PropertyType, dataProperty.Name);
}
}
}
По сути, я хочу пойти еще дальше:

Код: Выделить всё

repo.Get().OfType().ToList().ForEach(x => Console.WriteLine(x.GetIdentifier()));
но я натыкаюсь на стены, куда бы я ни повернулся.
вот как я пытаюсь расширить демо-версию.
Я пытаюсь добавить еще один уровень обобщений над типом клиента под названием Entity
клиент выглядит так

Код: Выделить всё

public class Client : Client where T : Entity, IClient, IEntity, new()
{
public T Data { get; set; }
public Client()
{
Data = Activator.CreateInstance();
}
public override string GetIdentifier() => Data.GetIdentifier();
}

public abstract class Client : Entity;
и объект выглядит так

Код: Выделить всё

public class Entity : Entity where T : Entity, IEntity, new()
{
public T Data {get; set;}
public Entity()
{
Data = Activator.CreateInstance();
}
public override string GetIdentifier() => Data.GetIdentifier();
}

public abstract class Entity
{
public int ID { get; set; }
public abstract string GetIdentifier();
}
первая проблема, с которой я столкнулся при попытке расширить это, включив возможность запрашивать все объекты, — это ошибка:

Код: Выделить всё

The instance of entity type 'Entity' cannot be tracked as the entity type 'Client.Data#SoleTrader' because the two types are not in the same hierarchy.
и это происходит из моего общего вызова репозитория _context.Add(entity)
Я опубликовал код, который выдает эту ошибку здесь: https://github.com/sebastianwhiffen/Com ... F-Entities, если вы хотите посмотреть больше контекста.
Но в суммировании. Я хочу иметь возможность создавать иерархию вложенных универсальных объектов, начиная с Entity, и (теоретически) иметь возможность продолжать это вложение так долго, как захочу.
Есть идеи? любые другие решения, которые предоставляют мне этот краткий общий синтаксис репо, избегая при этом серьезных болей в запястьях при записи

Код: Выделить всё

public class SoleTraderClient : Client { }
public class SoleTraderEntity : Entity { }
etc...
для всех возможных комбинаций структуры объекта

Подробнее здесь: https://stackoverflow.com/questions/792 ... th-ef-core
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Разница между основным ядром Linux и черным ядром Linux Beaglebone
    Anonymous » » в форуме Linux
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Вложенные дженерики Java с необработанными типами, вывод типа возврата
    Anonymous » » в форуме JAVA
    0 Ответы
    47 Просмотры
    Последнее сообщение Anonymous
  • Вложенные модели Pydantic и дженерики
    Anonymous » » в форуме Python
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Вложенные дженерики с EF Core
    Anonymous » » в форуме C#
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Вложенные дженерики с EF Core
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»