Получить ключ от неизвестного лица

Здравствуйте, я хотел бы получить значение первичного ключа.

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;
.
.
.
Другие вопросы по тегам