Получить ключ от неизвестного лица
Здравствуйте, я хотел бы получить значение первичного ключа.
public static void Look(LEBAEntities db, object obj) {
// if getPrimaryKey(obj) == 0
db.Entry(obj).State = EntityState.Added;
// else
db.Entry(obj).State = EntityState.Modified;
}
Есть ли функция или какой-либо способ получить первичный ключ с Entity Framework?
1 ответ
Решение
Вот несколько решений:
1- Ваши сущности наследуют от Base Class
какой базовый класс имеет Id
собственность и вы делаете Look
универсальный метод:
public abstract class BaseEntity
{
protected BaseEntity()
{
}
public virtual int Id { get; set; }
}
public static void Look<TEntity>(LEBAEntities db, TEntity entity) where TEntity : BaseEntity {
if(entity.Id == 0)
db.Entry(entity).State = EntityState.Added;
else
db.Entry(entity).State = EntityState.Modified;
}
2- Вы можете использовать GetProperties
метод с помощью отражения и сравните имя свойства:
public static void Look(LEBAEntities db, object obj) {
var type = obj.GetType();
var key = type.GetProperties().FirstOrDefault(p =>
p.Name.Equals("ID", StringComparison.OrdinalIgnoreCase)
|| p.Name.Equals(type.Name + "Id", StringComparison.OrdinalIgnoreCase));
if(key == 0)
db.Entry(obj).State = EntityState.Added;
else
db.Entry(obj).State = EntityState.Modified;
}
3 - Вы можете запросить метаданные отображения, чтобы получить ключ:
public static void Look(LEBAEntities db, object obj) {
var type = obj.GetType();
var type = typeof (IdentityUser);
var objectContext = ((IObjectContextAdapter)context).ObjectContext;
IEnumerable<string> retval = (IEnumerable<string>)objectContext.MetadataWorkspace
.GetType(type.Name, type.Namespace, System.Data.Entity.Core.Metadata.Edm.DataSpace.CSpace)
.MetadataProperties.First(mp => mp.Name == "Id")
.Value;
.
.
.