2

EntityFramework 4.3 を使用してエンティティをデータベースにアタッチおよび保存するための再利用可能なデータベース リポジトリ メソッドに取り組んでいます。

    private void SaveObject<T>(T entityToSave, DbSet<T> dbSet) where T : class
    {
        if (db.Entry(entityToSave).State == EntityState.Detached)
        {
            if (entityToSave.Id == Guid.Empty) // how do I access the Id property?
                dbSet.Add(entityToSave);
            else
                db.Entry(entityToSave).State = EntityState.Modified;
        }
    } 

私が直面している問題は、どのプロパティが Id であるかをメソッドに伝える必要があるため、それが設定されているかどうかを確認できることです。空の場合、新しいレコードを作成していることがわかります。それ以外の場合は、既存のレコードを変更しています。

Id プロパティが何であるかをメソッドに伝えるにはどうすればよいですか?

4

3 に答える 3

3

プロパティを含むインターフェイスを作成する必要がありIdます。

すべてのエンティティ クラスにこのインターフェイスTを実装させ、それを実装するように制約します。( where T : IHasId)
その後、メソッドでこのインターフェースのすべてのメンバーにアクセスできるようになります。

于 2012-05-13T14:19:50.080 に答える
3

プロパティを定義するインターフェイスまたは基本クラスが必要であり、Idそれを一般的な制約として使用します。例:

public interface IEntity
{
    Guid Id { get; }
}

private void SaveObject<T>(T entityToSave, DbSet<T> dbSet) where T : class, IEntity
    {
        if (db.Entry(entityToSave).State == EntityState.Detached)
        {
            if (entityToSave.Id == Guid.Empty) // how do I access the Id property?
                dbSet.Add(entityToSave);
            else
                db.Entry(entityToSave).State = EntityState.Modified;
        }
    } 
于 2012-05-13T14:20:01.390 に答える
1

他の人が示したように、インターフェイスを使用して問題を解決できます。別の可能性は、アクセサーデリゲートを定義することです

private void SaveObject<T>(T entityToSave, DbSet<T> dbSet, Func<T,Guid> accessId)
{
    ...
    Guid id = accessId(entityToSave);
    ...
}

と電話する

SaveObject(entityToSave, dbSet, e => e.Id)
SaveObject(otherEntityToSave, dbSet, e => e.UserID)

インターフェースに対する利点は、ID に異なる名前を付けることができ、2 番目のジェネリック パラメーターと一緒に異なる型を使用できることです。

private void SaveObject<T,I>(T entityToSave, DbSet<T> dbSet, Func<T,I> accessId)
{
    ...
    I id = accessId(entityToSave);
    ...
}
于 2012-05-13T14:25:47.090 に答える