EF Entity的子类未在DBContext上提交,因为它不是模型的一部分

时间:2016-12-14 14:11:54

标签: c# entity-framework inheritance dbcontext

我正在使用EF6。我在EF模型中创建了一个实体,它充当一个名为AppUser的超类,包含我想在数据库中生成的所有属性。但是,我创建了另一个名为AppUserM的类,继承自AppUser;子类有一些用于某些UI操作的方法。 请参阅下面的AppUser类:

[Table("appUser")]
public class AppUser
{
    public AppUser()
    {
        this._AccessRights = new HashSet<AccessRight>();
        this._ActivityLog = new HashSet<ActivityLog>();
    }
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int userId { get; set; }
    [MaxLength(50)]
    [DisplayName("Username")]
    public string username { get; set; }
    [DataType(DataType.Password)]
    [MaxLength(2000)]
    [DisplayName("Password")]
    public string password { get; set; }
    [MaxLength(4000)]
    [DisplayName("FullName")]
    public string fullname { get; set; }
    public bool isADUser { get; set; }
    [ForeignKey("BankBranch")]
    public int branchId { get; set; }
    [ForeignKey("AppRole")]
    public int roleId { get; set; }
    public virtual BankBranch BankBranch { get; set; }
    public virtual AppRole AppRole { get; set; }
    public virtual ICollection<AccessRight> _AccessRights { get; set; }
    public virtual ICollection<ActivityLog> _ActivityLog { get; set; }

}

子类如下所示:

public class AppUserM : AppUser
{
    public void Add()
    {
        using (var cntx = new JEntityDbContext())
        {
            cntx.AppUsers.Add(this);
            cntx.SaveChanges();
        }
    }
    public void Read()
    { 

    }
}

执行此操作会在AppUserM的Add()方法中引发异常,完全是在cntx.AppUsers.Add(this),请参阅下面的实现;

     AppUserM user = new AppUserM
     {
          username = "Hakeem",
          password = "pass",
          roleId = 1,
          isADUser = false,
          fullname = "Ojulari Hakeem Olusegun"
     };
     user.Add();

例外是:

其他信息:实体类型AppUserM不是当前上下文模型的一部分。

我不想像这样

在Add()方法中映射类
AppUser user = new AppUser {username = this.username};

然后呢

cntx.AppUsers.Add(user);

我希望尽量减少打字时间并确保效率。有没有更好的方法来实现这一目标。感谢您的贡献

1 个答案:

答案 0 :(得分:0)

我不希望EF可以处理这个问题,因为EF会为您的实体类创建代理(通过覆盖虚拟导航道具来处理延迟加载等)。

我只是将方法添加到现有的AppUser类。

[Table("appUser")]
public class AppUser
{
    public AppUser()
    {
        this._AccessRights = new HashSet<AccessRight>();
        this._ActivityLog = new HashSet<ActivityLog>();
    }
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int userId { get; set; }
    // ... other properties

    public void Add()
    {
        using (var cntx = new JEntityDbContext())
        {
            cntx.AppUsers.Add(this);
            cntx.SaveChanges();
        }
    }
    public void Read()
    { 

    }
}