2016-12-14 4 views
0

私はEF6を使用しています。 EFモデルで、データベースに生成するすべてのプロパティを含むAppUserというスーパークラスとして機能するエンティティを作成しました。しかし、AppUserから継承したAppUserMという別のクラスを作成しました。子クラスにはいくつかのUI操作のためのいくつかのメソッドがあります。 以下APPUSERクラスを参照してください:EFの子クラスがモデルの一部ではないため、DBContextでコミットされません

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

    } 
} 

は(正確にcntx.AppUsers.AddでAppUserMのAdd()メソッドで例外が発生しますこれは以下の実装を参照してください。

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

例外がある:

追加情報:エンティティタイプAppUserMは、現在のコンテキストのモデルの一部ではありません。

私は

cntx.AppUsers.Add(user); 

後、私は時間を入力して最小化し、効率性を確保したい。この後、この

AppUser user = new AppUser {username = this.username}; 

のようなadd()メソッド内のクラスをマッピングする必要はありません。これを達成するためのより良い方法はありますか?あなたの貢献に感謝します

+0

** AppUserMにいくつかのプロパティを追加して、コミットする前にメソッド内の内部操作をしたい場合があるので、**(AppUserユーザー)**を追加することもできます。 –

+0

私はEFがこれを扱うことは期待していません。なぜなら、EFはエンティティクラス(遅延ロードを処理するため、そして仮想ナビゲーションの小道具をオーバーライドするため)のためのプロキシを作成するからです。したがって、もう1つの相続層を追加することはできません。また、どのようにしてEFが 'AppUserM'型のインスタンスを返すと思いますか? – Maarten

答えて

0

私は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」で分割することはできますか? –

関連する問題