c# - 实体框架 - 如何使用通用添加功能来比较导航属性
问题描述
我是实体框架和泛型的初学者。
问题一:
我遵循用于向 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));
}
有人可以告诉我如何使用它来解决上述问题,因为我目前正在使用集合,也许可以更快地添加范围?
泰
解决方案
如果您有具有相同属性的实体,为什么不创建一个名为 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
}
}
推荐阅读
- javascript - 我有从 iframe 打开弹出窗口的代码。如果页面上有多个这些 iframe,我如何防止多个弹出窗口?
- java - 对于 ABC 类型,方法 abc(long) 未定义
- python-3.x - 如何在第 1 级分组并在熊猫中使用多索引在另一个级别上排名?
- maven - 将 Jenkins 服务器从 Java8 更新到 Java 11 是否支持 Java8 和 Java11 应用程序?
- android - 无法从自定义微调器中选择项目(AutoCompleteTextView)
- laravel - 如何使用 laravel 将多个具有不同名称的复选框存储到 mysql
- python - numpy 字符串数组是否比 python 字符串快
- python - 您可以在单个 tkinter 标签中同时显示图像和一些文本吗?
- python - Python:在数据框中映射多个字符串但只有 1 个有效?
- javascript - Javascript 日期在 stringify 之后改变了一天的差异