2015-04-24 57 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; 
. 
. 
.