0

CTP5の追加または更新パターンが必要です。モデルを想定すると:

public class User
{
    public int UserId { get; set; }
    public ICollection<Address> Addresses { get; set; }
}
public class Address
{
    public int AddressID { get; set; }
    public string Location { get; set; }
}

新しいユーザーを追加すると、対応するアドレステーブルにもデータが入力されます。ただし、ユーザーがすでにDBにいる場合は、DbUpdateExceptionが発生します。この場合、データベース内のデータを新しいデータで更新する必要があります。これどうやってするの?

データベース内のデータ

テーブルアドレス

AddressIDの場所

1ジョンプレイス

2 MaryPlace

3ジミープレイス

更新したユーザーは、Addressesコレクション1にAddressId:2、Location=GeorgePlaceのアイテムがあります。ただし、ID = 2の場合、Dbには、location=MarryPlaceのレコードがすでに存在します。GeorgePlaceにMarryPlaceを上書きしてほしい。

ユーザーに割り当てられていないアドレスを持つことはできません

私は次のようなユーザーを作成します:

var user=new User();
user.Id=GetUserIDfromService();
foreach(var address in GetAddressesFromService(user.Id)){
    user.Addresses.Add(address);
}
context.Users.Add(user);
context.SaveChanges();//this may throw an exception, because there is already a user with this id.
4

2 に答える 2

0

現在の問題は、新しいUserオブジェクトを準備してそのアドレスを入力するが、アドレスが同じコンテキストを介してDBからロードされないため、コンテキストがそれらを認識しないことです。Addメソッドを呼び出すと、オブジェクトグラフ内のすべてのオブジェクトが取得され、それらが新規(挿入される)としてマークされます。これを回避する唯一の方法は、どのアドレスが新しいか、どのアドレスが変更であるかを手動で指定するか、ユーザーインスタンスにアドレスを追加する前にコンテキストからアドレスをロードすることです。

アドレスをマークするためのコードは次のようになります。

var user = new User(); 
user.Id = GetUserIDfromService(); 
context.Users.Add(user); 
foreach(var address in GetAddressesFromService(user.Id))
{
  context.Addresses.Attach(address);
  // Let say that new address always have 0 Id      
  context.Entry(address).State = address.Id == 0 ? EntityState.Added : EntityState.Modified;      
  user.Addresses.Add(address); 
} 

context.SaveChanges();
于 2011-02-18T10:08:53.687 に答える
0

既存のユーザーを更新する場合は、挿入しないでください ( を呼び出さないでくださいAdd())。最初に Id でユーザーをロードし、そのプロパティを変更SaveChanges()してコンテキストで呼び出します。

var db = new DatabaseContext();
var user = db.Users.Find(myUserId);
user.Name = "New Name";
db.SaveChanges();
于 2011-02-18T08:26:49.343 に答える