获取未知实体的密钥

时间:2015-04-24 12:18:04

标签: c# entity-framework primary-key state dbcontext

您好我想获得主键值。

Mary
had
1.0
little
lamb...

是否有使用Entity Framework获取主键的功能或方法?

1 个答案:

答案 0 :(得分: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;
.
.
.