2

实体框架中实现通用持久方法的最佳解决方案是什么?

例如有一个公司实体:

public class Company
{
    public Company()
    {
        Id = Guid.NewGuid();
    }

    public Guid Id { get; set; }

    public string Name { get; set; }
}

Id 属性可以在实体存储到数据库之前生成。

所以任务是实现 Persist 方法:

public class Repository
{
    private DbSet<Company> _dbSet;

    public void Persist(Company company)
    {
        // How to implement body here to Add entity if it doesn't exists yet
        // or Modify it in opposit case?
        // In terms of database entity record is required to be inserted or updated.
    }
}

谢谢!

4

1 回答 1

4

在您无法识别Company实例是新实例还是以前从数据库加载的示例中,您必须查询数据库:

public void Persist(Company company)
{
    var companyInDb = _dbSet.SingleOrDefault(c => c.Id == company.Id);
    if (companyInDb != null)
    {
        _context.Entry(companyInDb).CurrentValues.SetValues(company);
    }
    else
    {
        _dbSet.Add(company);
    }
    _context.SaveChanges();
}

如您所见,您需要对_context存储库中的上下文的引用。

如果您将公司标记为新公司或从数据库加载,则可以使用另一种方法,例如使用特殊构造函数:

public class Company
{
    public Company()
    {
    }

    public Company(bool isNew)
    {
        Id = Guid.NewGuid();
        _isNew = isNew;
    }

    public Guid Id { get; set; }
    public string Name { get; set; }

    private bool _isNew;
    public IsNew { get { return _isNew; } }
}

然后该Persist方法不需要加载原始文件:

public void Persist(Company company)
{
    if (!company.IsNew)
    {
        _context.Entry(company).State = EntityState.Modified;
    }
    else
    {
        _dbSet.Add(company);
    }
    _context.SaveChanges();
}

请注意,所有这些仅更新公司的标量属性,而不是关系。

于 2012-09-22T13:12:28.637 回答