下面是幾種解決方案:
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;
.
.
.
Code-first?或數據庫優先? – DrewJordan