структура сущности - как использовать универсальную функцию добавления со сравнением свойств навигации - PullRequest
0 голосов
/ 31 августа 2018

Я новичок в области сущностей, а также в дженериках.

Вопрос 1:

У меня есть следующая общая функция для добавления или использования существующих объектов в БД:

 public static T AddIfNotExists<T>(this DbSet<T> dbSet, T entity, Expression<Func<T, bool>> predicate = null) where T : class
    {
        T modul;

            if (dbSet.Any())
            {
                modul = dbSet.FirstOrDefault(predicate);
                if (modul == null)
                {
                    modul = dbSet.Add(entity);
                }
            }
            else
            {
                modul = dbSet.Add(entity);
            }
        return modul;
    }

У меня есть код первой таблицы со свойством навигации по свойствам таблицы:

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public virtual ResourceType ResourceType { get; set; }
    [Required]
    public virtual ICollection<Scan> ScanList { get; set; }

    public virtual ICollection<ResourceObject> ParentResources { get; set; }

    public virtual ICollection<Property> Properties { get; set; }

Теперь я хочу изменить общий метод для сравнения также обнуляемых свойств сущности, и я не совсем уверен, как справиться с этим. Я думаю, что мне нужен правильный предикат?

Вопрос 2:

Я также получил эту функцию из stackoverflow:

public static void AddRangeIfNotExists<TEnt, TKey>(this DbSet<TEnt> dbSet, IEnumerable<TEnt> entities, Func<TEnt, TKey> predicate) where TEnt : class
    {
        var entitiesExist = from ent in dbSet
                            where entities.Any(add => predicate(ent).Equals(predicate(add)))
                            select ent;

        dbSet.AddRange(entities.Except(entitiesExist));
    }

Может кто-нибудь подскажет, как использовать его в ответе на вопрос выше, потому что я сейчас работаю с коллекциями, может быть, добавить диапазон, работающий быстрее?

ти

1 Ответ

0 голосов
/ 31 августа 2018

Если у вас есть сущности с одинаковыми атрибутами, почему бы не создать класс с именем EntityBase и сделать так, чтобы все ваши сущности расширяли его. А затем в вашем родовом методе измените с «где T: класс» на «где T: EntityBase». Внутри вашего метода вы можете иметь доступ к этим атрибутам, например:

 public static T AddIfNotExists<T>(this DbSet<T> dbSet, T entity, Expression<Func<T, bool>> predicate = null) where T : EntityBase
    {
        if(entity.AttributeNullable == null)
        {
            //do some logic
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...