用EF Core一般查找和设置主键的正确方法是什么

时间:2019-12-17 23:26:44

标签: asp.net-core entity-framework-core primary-key

我正在尝试从实体类上的通用参数访问主键,这是我所有数据库对象的继承物。

以下代码有效。 但是从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);
            }
        }
}

1 个答案:

答案 0 :(得分:0)

所以,我假设您有一堆实体类,它们的主键名称各不相同,例如DoodadIdWidgetId等,并希望它们全部扩展具有单个属性的基类。访问主键?如果是这样,我已经使用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; }
    // ......
}