1

我有一个名为 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,但我认为这不是最有效的。我还可以对一些 map 方法进行硬编码,使我能够弄清楚要添加到什么 DBSet ......但我无法想象那里没有任何东西已经以更有效的方式完成这两项操作。

所以......我怎样才能确定 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();
}

我想远离反思……但是,嗯。看起来就是这样。

谢谢大家。

4

1 回答 1

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 的 MSDN

http://msdn.microsoft.com/en-us/library/gg696521(v=vs.103).aspx

于 2013-07-05T16:05:36.517 回答