2

一般的な永続メソッドを実装するためのエンティティ フレームワークでの最適なソリューションは何ですか?

たとえば、Company エンティティがあります。

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インスタンスが新しいものか、以前にデータベースからロードされたものかを認識できない例では、DB にクエリを実行する必要があります。

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ご覧のとおり、リポジトリ内のコンテキストへの参照が必要です。

たとえば、特別なコンストラクターを使用して、会社を新規または DB からロードしたものとしてマークする場合は、別のアプローチが可能です。

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 に答える