8

私の問題は、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; }
}
4

2 に答える 2

2

コードを実行して、正確に期待される結果を取得しました。既存のUserIdとContactOptionIdを含むUserContactsテーブルの新しい行なので、そこで何が起こっているのかわかりませんが、UserContactオブジェクトにFKを明示的に含めることができます。 CodeFirstがレコードを挿入する方法を完全に制御できます。そのためには、UserContactを次のように変更する必要があります。

public class UserContact
{
    public int Id { get; set; }

    // By Convention these 2 properties will be picked up as the FKs: 
    public int UserId { get; set; }
    public int ContactOptionId { get; set; }

    [Required]
    public User User { get; set; }        
    [Required]
    public ContactOption ContactOption { get; set; }

    public string Data { get; set; }
}

そして、次のようにコードを変更できます。

var contactOption = _context.ContactOptions.Find(someId);
var user = _context.Users.Find(1);

var contact = new UserContact 
{ 
    ContactOptionId = contactOption.Id,  
    UserId = user.Id,
    Data = "someData"
};

user.UserContacts.Add(contact);
context.SaveChanges();
于 2010-11-14T01:17:43.967 に答える
1

私の問題は、2 つのコンテキストがあることが判明しました。コンテキストが 1 つだけになるようにコードを少し作り直したところ、問題は解決しました。正しい方向に向けてくれた Morteza Manavi に感謝します。

于 2010-11-14T14:21:06.787 に答える