私の問題は、2つのコンテキストがあることが判明しました。コードを少し作り直して、コンテキストが1つだけになるようにしたところ、問題は解決しました。
それ自体がContactOptionを持つUserContactのリストを持つユーザーがいます。かなり単純な1対多、多数対1で、中央にUserContactテーブルがあります。
ユーザーをデータベースからプルして新しいUserContactを作成し、ContactOptionを既存のアイテム(データベースからプルしたもの)に設定した場合、SaveChangesを実行すると、エンティティフレームワークはデータベースに新しいContactOptionを作成します。基本的に、UserContactに追加したものの複製です(新しいIDを取得することを除いて)。
私はこれと数時間戦いましたが、これを理解することはできません。何か案は?
データベースクエリにリポジトリパターンを使用していますが、それらが同じコンテキストを共有していることを確認しました。
私はこれでデータベースからユーザーを引き出します:
var user = _context.Users.Include("UserContacts.ContactOption")
.Where(id => id == 1);
そして、連絡先オプションは次のように引き出されます。
var co = _context.ContactOptions.FirstOrDefault(c => c.Id == id);
そして、次のようにContactOptionをUserContactに追加します。
var contactOption = _context.ContactOptions.FirstOrDefault(c => c.Id == someId);
var contact = new UserContact { ContactOption = contactOption };
contact.Data = "someData";
user.UserContacts.Add(contact);
私のモデルは次のようになります。
public class User
{
[Key]
public int Id { get; set; }
public virtual ICollection<UserContact> UserContacts { get; set; }
}
public class UserContact
{
[Key]
public int Id { get; set; }
[Required]
public User User { get; set; }
[Required]
public ContactOption ContactOption { get; set; }
public string Data { get; set; }
}
public class ContactOption
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}