2017-01-22 10 views
1

私は、次のモデルがあります。各エンティティは、いくつかの関連するユーザーがいることをEntity Frameworkモデルでユーザーオブジェクトを参照するにはどうすればよいですか?

public class MyEntity 
{ 
    public Guid Id { get; set; } 
    public virtual ICollection<ApplicationUser> AssociatedUsers { get; set; } 

    public MyEntity() 
    { 
     AssociatedUsers = new HashSet<ApplicationUser>(); 
    } 
} 

お知らせ。私のコントローラでは、私はこのようなデータベースにMyEntityのインスタンスを追加しようとしています:

private ApplicationDbContext db = new ApplicationDbContext(); 

// ... 

ApplicationUser currentUser = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()); 

MyEntity entityInstance = new MyEntity(); 
entityInstance.Id = Guid.NewGuid(); 
entityInstance.AssociatedUsers.Add(currentUser); 
db.MyEntities.Add(entityInstance); 
db.SaveChanges(); 

しかし、そのコードは、次のエラーがスローされます。

An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

私がいることをそのエラーメッセージから集まりますCurrentUserはまだApplicationUserManagerをバックアップするデータベースコンテキストによって管理されているため、別のコンテキストに追加することはできません。しかし、other cases that I have found documentedとは異なり、私は単にデータベース接続を共有するようにコンテキストを切り替えることはできません。ユーザオブジェクトはApplicationUserManagerから来ています。これを解決するために私は何をする必要がありますか?基本的に何か間違っているのですか?代わりにIDを使用して対応するユーザーを検索することができますが、オブジェクトに直接アクセスできるようにすることができます。

答えて

1

あなたの問題は、あなたが投稿したリンクの問題と非常によく似ています。言い換えれば、異なるコンテキストからユーザーを操作することはできません。ここで:

ApplicationUser currentUser = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()); 

あなたは効果的System.Web.HttpContext.Current.GetOwinContext()からcurrentUserを得たが、その後はApplicationDbContextあるdbを使用して、それを保存しようとしています。

同じ文脈でそれを維持し、あなたの問題が解決されます:

var currentUser = db.Users.Find(System.Web.HttpContext.Current.User.Identity.GetUserId()); 

var entityInstance = new MyEntity(); 

entityInstance.Id = Guid.NewGuid(); 

entityInstance.AssociatedUsers.Add(currentUser); 
db.MyEntities.Add(entityInstance); 
db.SaveChanges(); 
関連する問題