我有一个名为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 ...但是我无法想象没有那些已经以更有效的方式完成这两项操作的东西。 / p>
那么......我怎样才能确定Key及其值?如何确定DbSet在这个泛型中的用途?
更新
基于下面的答案以及其他类似的帖子,这就是我最终做的事情......(几乎只是结合了两个答案)
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();
}
我想远离反思......但是,嗯。看起来就是这样。
谢谢大家。
答案 0 :(得分:3)
您的上下文有一个Set<T>()
方法,它会返回正确类型的DBSet。
这将使你的方法
private int Add(T entity)
{
Using (BarContect db = new BarContext())
{
DbSet dbSet = db.Set<T>();
dbSet.Add(entity);
db.SaveChanges();
}
return entity.PrimaryKeyValue; // this would be the integer value of the id
}
以下是Set
的MSDNhttp://msdn.microsoft.com/en-us/library/gg696521(v=vs.103).aspx