С# Entity Framework, Get Inserted ID (общий)

Вопрос:

У меня есть метод под названием 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], чтобы выяснить, какое свойство в классе сущности содержит идентификатор, но я не думаю, что это наиболее эффективно. Я также могу жестко закодировать некоторый метод карты, который позволяет мне выяснить, что DBSet добавить… но я не могу себе представить, что нет ничего такого, что уже делает обе эти операции более эффективным способом.

Итак… Как я могу определить ключ и его значение, и как я могу выяснить, что 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();
}

Я хотел держаться подальше от размышлений… но, мех. Похоже, что так.

Спасибо всем.

Лучший ответ:

В вашем контексте есть метод 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
}

Вот MSDN для Set

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

Оцените статью
TechArks.Ru
Добавить комментарий