gpt4 book ai didi

entity-framework - 具有 Entity Framework 的非常通用的 CreateOrUpdate 方法

转载 作者:行者123 更新时间:2023-12-04 02:48:31 25 4
gpt4 key购买 nike

我创建了一个通用存储库类,我的所有其他存储库类都从该类继承。这很棒,因为这意味着几乎所有的管道都为所有存储库完成了一次。我对我在说什么做了一个完整的解释here ,但这是我的 GenericRepository 的代码(为简洁起见,删除了一些代码):

public abstract class GenericRepository<T> : IGenericRepository<T> where T : class, new()
{
private IMyDbContext _myDbContext;

public GenericRepository(IMyDbContext myDbContext)
{
_myDbContext = myDbContext;
}

protected IMyDbContext Context
{
get
{
return _myDbContext;
}
}

public IQueryable<T> AsQueryable()
{
IQueryable<T> query = Context.Set<T>();
return query;
}

public virtual void Create(T entity)
{
Context.Set<T>().Add(entity);
}

public virtual void Update(T entity)
{
Context.Entry(entity).State = System.Data.EntityState.Modified;
}
}

如您所见,我有一个 Create 方法和一个 Update 方法。拥有“CreateOrUpdate”方法会非常方便,因此我不必每次必须将某些内容保存到数据库时手动检查现有对象。

我在 Entity Framework 中的每个对象都有一个“Id”,但这里的挑战是 GenericRepository 与“T”一起使用。

现在,通过相当长的介绍,我的具体问题。

如何创建通用 CreateOrUpdate我的方法 GenericRepository ?

更新

在 Marcins 响应之后,我在我的 GenericRepository 中实现了以下通用方法。我需要一些时间才能测试它是否按预期工作,但它看起来很有希望。
public virtual bool Exists(Guid id)
{
return Context.Set<T>().Any(t => t.Id == id);
}

public virtual void CreateOrUpdate(T entity)
{
if (Exists(entity.Id))
{
var oldEntity = GetSingle(entity.Id);
Context.Entry(oldEntity).CurrentValues.SetValues(entity);
Update(oldEntity);
}
else
{
Create(entity);
}
}

上面的代码在更新时与数据库的往返次数不少于 3 次。我确信它可以被优化,但这并不是这个问题的真正练习。

这个问题更好地处理了这个话题:
An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key

最佳答案

使用 Id 创建接口(interface)属性,在您的每个实体上实现它并向您的类添加另一个通用约束:

public interface IEntity
{
int Id { get; set;}
}


public abstract class GenericRepository<T> : IGenericRepository<T> where T : class, IEntity, new()

这样,您就可以使用 Id通用存储库类中的属性。

当然- Id不必是 int ,可以是 Guid也是。

关于entity-framework - 具有 Entity Framework 的非常通用的 CreateOrUpdate 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18287643/

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