3

EF の「コード ファースト」方式でいくつかのコードを試していたところ、奇妙な問題が発生しました。

私のデータコンテキスト:

    public class BookmarkerDataContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>().HasKey(u => u.UserId);
            base.OnModelCreating(modelBuilder);
        }
     }

ユーザー オブジェクトの場所:

   public class User
    {
        public long UserId { get; set; }
        public ICollection<Tag> Tags { get; set; }
    }

私のコードでは、かなり単純なことをしています:

public void UpdateUserTags(User user,ICollection<Tag> taglist)
    {
        user.Tags = new List<Tag>(user.Tags.Union(taglist));
        datacontext.Users.Add(user);
        datacontext.SaveChanges();
    }

この関数に渡すユーザー オブジェクトは、次のような結果です。

datacontext.Users.SingleOrDefault(u => u.UserId==id)

UpdateUserTags 関数を呼び出すたびに、ユーザー テーブルを更新するのではなく、新しい行を作成するように見えます。ここで何か間違ったことをしていますか?

4

4 に答える 4

4

@Donald は正しいですAttach。更新を行うときに ObjectContext を使用する必要があります。

ただし、それはエンティティが切り離されている場合のみです。

グラフから 1 つのエンティティを既に取得しているように思われる場合:

var user = datacontext.Users.SingleOrDefault(u => u.UserId==id);

つまり、アタッチしたり、再度取得したりする必要はありません。これを行うだけです:

var user = datacontext.Users.SingleOrDefault(u => u.UserId==id);
user.Tags = new List<Tag>(user.Tags.Union(taglist));
context.SaveChanges();

ただし、タグコレクション全体を置き換えることはお勧めしません。タグを追加します。

user.Tags.Add(someTag);

HTH

于 2010-11-03T22:37:26.243 に答える
3

オブジェクトを追加するのではなく、データコンテキストにオブジェクトをアタッチしたいと思います。

public void UpdateUserTags(User user,ICollection<Tag> taglist)
{
    datacontext.Attach(user);
    user.Tags = new List<Tag>(user.Tags.Union(taglist));
    datacontext.SaveChanges();
}

アタッチされると、コンテキストはオブジェクトを認識するようになります。変更を保存したら、データベースに永続化する必要があります。

于 2010-11-03T21:57:35.937 に答える
0

これは特定の問題とは関係ありませんが、遅延読み込みの場合は、タグを仮想としてマークする必要があります

public virtual ICollection<Tag> Tags { get; set; }

また、ユーザーに新しいタグを追加しようとしている(またはタグを更新しようとしている)ようです。その場合は、ドナルドが提案したようにAttachを使用する必要があります。

于 2010-11-03T22:13:16.843 に答える
0

この行はありませんか

datacontext.Users.Add(ユーザー);

ユーザー テーブルに追加する必要があるとして、ユーザー レコードを常にマークします。

レコードを適切に更新できるようにするには、古いコンテキストからユーザーを切り離し、新しいコンテキストに割り当てる必要があると思います。しかし、私は EF オタクではないので、ymmv

于 2010-11-03T21:57:13.203 に答える