首页 > 解决方案 > 实体框架 - 如何使用通用添加功能来比较导航属性

问题描述

我是实体框架和泛型的初学者。

问题一:

我遵循用于向 db 添加或使用现有实体的通用函数:

 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));
    }

有人可以告诉我如何使用它来解决上述问题,因为我目前正在使用集合,也许可以更快地添加范围?

标签: c#entity-frameworkgenerics

解决方案


如果您有具有相同属性的实体,为什么不创建一个名为 EntityBase 的类,并让您的所有实体都扩展它。然后,在您的通用方法中,从“where T:class”更改为“where 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
        }
    }

推荐阅读