gpt4 book ai didi

c# - Entity Framework 如果不存在则添加不更新

转载 作者:IT王子 更新时间:2023-10-29 04:10:57 25 4
gpt4 key购买 nike

我喜欢 AddOrUpdate 让您指定要检查的过滤器以避免添加重复项这一事实。但我想要没有更新的类似功能。

现在我做这样的事情:

var checkProfile = from p in db.Profile
where p => p.LastName == newProfile.lastName
&& p => p.FirstName == newProfile.firstName
&& p => p.Middle== newProfile.middle
select p;
if (checkProfile.FirstOrDefault() == null)
{
db.Profile.Add(newProfile);
db.SaveChanges();
}

我知道我可以做这样的事情:

db.Profile.AddOrUpdate(p => new {p.LastName, p.FirstName, p.Middle}, newProfile);
db.SaveChanges();

但在这种情况下我宁愿跳过修改数据。

第一个示例完成了我想要的,但代码更多。在第一个示例中,是否有更简单/更清晰的方法来执行我想要的操作?

更新:

我喜欢 Ognyan Dimitrov 的建议。我正在努力实现它。我的模型继承自 BaseEntity。我可以在那里放一个通用版本吗?

我的模型是这样定义的:

public class Address :BaseEntity
{

我的基础实体:

public class BaseEntity 
{
public virtual T AddIfNotExists<T>(T entity, Expression<Func<T, bool>> predicate = null)
{
var exists = predicate != null ? DbSet.Any(predicate) : DbSet.Any();
return !exists ? DbSet.Add(entity) : null;
}
}

我收到 Any(...) 和 Add(...) 的错误。 Add(...) 的错误是“非静态字段、方法或属性‘System.Data.Entity.DbSet.Add(object)’需要对象引用””

我应该使用 this.Add(object) 吗?

更新 2:

我创建了这段代码:

public static class DbSetExtensions
{
public static T AddIfNotExists<T>(this DbSet<T> dbSet, T entity, Expression<Func<T, bool>> predicate = null) where T : class, new()
{
var exists = predicate != null ? dbSet.Any(predicate) : dbSet.Any();
return !exists ? dbSet.Add(entity) : null;
}

}

现在我想这样调用它,但这是不正确的。原谅我的不理解。

_db.ProfileIdentifier.AddIfNotExists(newIdentifier,
pi => new {pi.ProfileId, pi.ProfileIdentifierTypeId, pi.ProfileIdentifierValue});

更新 - 解决方案:

我可以这样调用 DbSetextensions:

_db.ProfileIdentifier.AddIfNotExists(newIdentifier,
pi => pi.ProfileId == profileId &&
pi.ProfileIdentifierTypeId == (int)type &&
pi.ProfileIdentifierValue == value);

非常感谢 Ognyan 与我一起工作!!!

最佳答案

您是否尝试检查该实体是否存在,如果不存在,则添加它?像这样:

更新

using System.Linq.Expressions;
public class ContextWithExtensionExample
{
public void DoSomeContextWork(DbContext context)
{
var uni = new Unicorn();
context.Set<Unicorn>().AddIfNotExists(uni , x => x.Name == "James");
}
}

public static class DbSetExtensions
{
public static T AddIfNotExists<T>(this DbSet<T> dbSet, T entity, Expression<Func<T, bool>> predicate = null) where T : class, new()
{
var exists = predicate != null ? dbSet.Any(predicate) : dbSet.Any();
return !exists ? dbSet.Add(entity) : null;
}
}

你可以直接使用这个方法,调用之后记得调用DbContext.SaveChanges()。

关于c# - Entity Framework 如果不存在则添加不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31162576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com