AddFoo(Foo foo) というメソッドがあります
private int AddFoo(Foo foo)
{
Using (BarContext db = new BarContext())
{
db.Foos.Add(foo);
db.SaveChanges();
}
return foo.FooID;
}
エンティティを受け入れてIDの例を返すように、より一般的にしたいと思います(アイデアを示すためだけにラフでおそらく機能しません:
private int Add(T entity)
{
Using (BarContect db = new BarContext())
{
// need to figure out how to find the appropriate set
DbSet dbSet = //Set Appropriate dbset based on entity type
dbSet.Add(entity);
db.SaveChanges();
}
return entity.PrimaryKeyValue; // this would be the integer value of the id
}
これで、リフレクションを使用して [Key] でマークされた属性を見つけて、エンティティ クラスのどのプロパティが ID を保持しているかを把握できますが、これが最も効率的だとは思いません。また、追加する DBSet を特定できるマップ メソッドをハード コードすることもできますが、これらの両方の操作をはるかに効率的な方法で実行できるものは他にないとは思えません。
だから...キーとその値を決定するにはどうすればよいですか?このジェネリックで使用するDbSetをどのように把握できますか?
アップデート
以下の回答と他の同様の投稿に基づいて、これが私がやったことです...(ほとんど2つの回答を組み合わせただけです)
private static int GetEntityKeyValue<T>(this T entity) where T : class
{
int ret = 0;
PropertyInfo key = typeof(T).GetProperties().FirstOrDefault(p => p.GetCustomAttributes(typeof(KeyAttribute), true).Length != 0);
if (key != null)
{
ret = (int)key.GetValue(entity, null);
}
return ret;
}
private static int Add<T>(T entity) where T : class
{
using (Foo db = new FooContext())
{
DbSet dbset = db.Set<T>();
dbset.Add(entity);
db.SaveChanges();
}
return entity.GetEntityKeyValue();
}
私は反射から離れたかった...しかし、まぁ。その通りのようです。
皆さんありがとう。