下面是几种解决方案:
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