2016-12-14 10 views
0

Я использую EF6. Я создал объект в EF-модели, который действует как суперкласс под названием AppUser, содержащий все свойства, которые я хочу создать в базе данных. Однако я создал еще один класс, называемый AppUserM, наследующий от AppUser; дочерний класс имеет несколько методов для некоторых операций пользовательского интерфейса. См класс AppUser ниже:Класс ребенка EF Entity не передается в DBC-контексте, потому что он не является частью модели

[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() 
    { 

    } 
} 

Выполнение этого вызывает исключение в методе Add() в AppUserM именно в cntx.AppUsers.Add (это) см. реализацию ниже;

 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); 

Я хочу, чтобы свести к минимуму время, печатая и обеспечения эффективности. Есть ли лучший способ достичь этого. Спасибо за ваши вклады

+0

Пожалуйста, обратите внимание, что я мог бы также сделать ** Добавить (пользователь AppUser) **, который я не хочу, потому что я мог бы добавить некоторые свойства AppUserM для внутренних манипуляций в рамках метода перед совершением. –

+0

Я не ожидаю, что EF сможет справиться с этим, поскольку EF создает прокси для ваших классов сущностей (для обработки ленивой загрузки и т. Д. Путем переопределения ваших виртуальных навигационных реквизитов). Поэтому добавление другого слоя наследования не будет работать. Кроме того, как вы ожидаете, что EF вернет любые экземпляры типа «AppUserM»? – Maarten

ответ

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() 
    { 

    } 
} 
+0

Вы говорите, что добавление методов в объект модели не вызовет каких-либо проблем в контексте? –

+0

Правильно, это не проблема. – Maarten

+0

Большое спасибо. Могу ли я разделить AppUser на «Partial»? –