我正在尝试从实体类上的通用参数访问主键,这是我所有数据库对象的继承物。
以下代码有效。 但是从Entity类内部访问DBcontext是不好的做法吗?如果是这样,我还能怎么做?是否有类似EF6的 IObjectContextAdapter ?
public abstract class Entity
{
private DBContext _context = new DBContext(null);
[NotMapped]
public int ID
{
get
{
return _context.PrimaryKeyValueInt(this);
}
set
{
_context.PrimaryKeyProperty(this).PropertyInfo.SetValue(this, value);
}
}
}
答案 0 :(得分:0)
所以,我假设您有一堆实体类,它们的主键名称各不相同,例如DoodadId
,WidgetId
等,并希望它们全部扩展具有单个属性的基类。访问主键?如果是这样,我已经使用Attributes和Reflection做过类似的事情。创建一个用于标识主键属性的属性:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class EntityIdAttribute : Attribute
{
}
然后创建基类并向其中添加属性。就我而言,我使用Guid
作为主键:
public abstract class Entity
{
[NotMapped]
public virtual Guid EntityId
{
get
{
return (Guid)EntityIdProperty.GetValue(this);
}
set
{
EntityIdProperty.SetValue(this, value);
}
}
private PropertyInfo EntityIdProperty => this.GetType().GetProperties()
.Where(prop => Attribute.IsDefined(prop, typeof(EntityIdAttribute)))
.FirstOrDefault();
}
然后在您的实体类中,扩展Entity
并用[EntityId]
装饰主键属性:
public class Widget : Entity
{
[EntityId]
public Guid WidgetId { get; set; }
// ......
}