2

小さなプロジェクトに Entity Framework v4 を使用しています。通常、NHibernate を使用します。私の問題は、DB コンテキストのコレクションに既に永続化されているオブジェクトを誤って追加したコードがあり、SaveChanges() を実行すると、EF がオブジェクトのコピーを作成し、新しい主キーを与えたことです。

これは便利ですが、私が望んでいたものではありません。その機能をオフにして、代わりに例外をスローする方法はありますか?

更新: コードが含まれるようになりました

public class CcUser
{
    public int Id { get; set; }
    [StringLength(50)]
    public string TrackingId { get; set; }
    [StringLength(50)]
    public string MembershipGuid { get; set; }

    public bool CookiesConfirmed { get; set; }
    [StringLength(200)]
    public string Email { get; set; }

    public DateTime Modified { get; set; }

}

public class MyDbContext : DbContext
{
    public DbSet<CcUser> Users { get; set; }

}

MyDbContext db = new MyDbContext();

var ccUser = db.Users.FirstOrDefault(u => u.TrackingId == id);   
ccUser.Modified = DateTime.UtcNow;
db.Users.Add(ccUser);
db.SaveChanges();
4

3 に答える 3

1

それが同じオブジェクトであったことをどうやって知っていますか?

たとえば、同じ名前である場合は、名前フィールドに一意のインデックスを追加できます。そうすれば、重複する行を追加すると例外がスローされます。

于 2010-11-17T21:31:41.473 に答える
1

ccuser を追加する行 (たとえば、最後から 2 番目の行) なしで試しましたか。オブジェクトがすでにコンテキストにアタッチされている場合、savechanges() は変更を永続化する必要があります。それでもうまくいかない場合は、savechanges() の前に detectchanges() を呼び出してみてください。

于 2010-11-18T18:26:43.587 に答える
0

その問題に遭遇したすべての人のために:

メソッドの.AddマーキングentityEntityState.Added. また、既存のコンテキスト項目を追加すると、遅延読み込みのため、EF はそれを新しいオブジェクトと見なします。

その後context.SaveChanges()、追加されたアイテムの新しい主キーを生成し、に保存しDBます。

AddOrUpdateその機能が必要ない場合に使用します。

MSDNの関連する質問はこちら

于 2016-05-26T12:18:37.897 に答える