2015-04-24 58 views
0

你好,我想获得主键值。获取未知实体的密钥

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; 
} 

是否有一个函数或任何方式获得主键的实体框架?

+0

Code-first?或数据库优先? – DrewJordan

回答

0

下面是几种解决方案:

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; 
. 
. 
.