5

このようなエンティティをデータベースに追加する方法を考え出すのにかなりの時間を費やしています。

public class ThingWithListings
{
    public virtual ICollection<Listing> Listings;
}

public class Listing
{
    public int Id;

    public virtual ListingData Data { get; set; } // has a FK to ListingData
    public DateTime Creation { get; set; }
}

public class ListingData
{
   public int listing_id; // PK

   ....
}

別のソースから「ThingWithLIstings」を取得して、データベースに書き込んでいます。注意が必要な部分は、任意の数の Listing が同じ ListingData にレポートする可能性があることです。そのため、ThingWithListings を追加または更新するときは、ListingData が既に存在するかどうかを確認し、存在する場合はそれを使用する必要があります。

私は EF を初めて使用するので、ここの Author Vickers の記事の AddOrUpdate を使用しています。これを行う。私の失敗した主な試みのすべての話を割愛して、誰かがこれを行う正しい方法を教えてくれることを願っています.

4

3 に答える 3

0

オブジェクト参照の他に、Listing クラスにDataプリミティブな外部キー フィールドもあると仮定します。listing_idそうでない場合は、追加することをお勧めします。

listing_idリストまたは配列内の既存の を取得することから始めることができます。これにより、後でデータベースを何度も往復する必要がなくなります。

次に、プロセスは非常に簡単です。Listing到着した各オブジェクトについてlisting_id、事前にフェッチされたリストに含まれているかどうかを確認します。

  • その場合は何もせず、プロパティを含めて をListingData追加 (または更新) するだけです。Listinglisting_id
  • そうでない場合は、オブジェクトListingとセットListing.DataListingData両方とも新しい (追加された) オブジェクトとして追加します。EF がキーを設定します。

(これは、ListingData を変更する同時ユーザーがいないことを前提としているため、ID のスナップショットを作成しても安全であることに注意してください)

于 2012-12-05T23:51:14.330 に答える
0
var newArrivals = new ThingWithListings();
newArrivals.Listings = new List<Listing>();
newArrivals.Listings.Add(
    new Listing()
    {
        creation = DateTime.Now,
        ListingData = new ListingData()
        {
            listing_id = 1
        }
    });

//another Listing with the same ListingData listing_id
newArrivals.Listings.Add(
    new Listing()
    {
        creation = DateTime.Now,
        ListingData = new ListingData()
        {
            listing_id = 1
        }
    });

//dummy id generator
int counter = 1;
using (var ctx = new Database1Entities())
{
    //get the ListingData from the current db context
    var dbListingData = ctx.ListingData;

    // the new arrivals
    foreach (Listing item in newArrivals.Listings)
    {
        //get the listing_id of a new arrival's ListingData
        int id = item.ListingData.listing_id;

        //get the ListingData from the db, if it exists
        var listingDataFromDb = dbListingData.FirstOrDefault(i => i.listing_id == id);

        //if not, create it and add it to the db
        if (listingDataFromDb == null)
        {
            listingDataFromDb = new ListingData()
                {
                    //use the new arrival's listing_id
                    listing_id = item.ListingData.listing_id
                };
            ctx.ListingData.Add(listingDataFromDb);
            ctx.SaveChanges();
        }

        //add the Listing by using the listingDataFromDb, which now references the db ListingData
        ctx.Listing.Add(new Listing()
        {
            id = counter++,
            creation = item.creation,
            ListingData = listingDataFromDb
        });
        ctx.SaveChanges();
    }
}
于 2012-12-05T23:23:19.597 に答える
0
if (DatabaseContext.ListingData.Any(l => l.listing_id == myId)) 
{   
  //already exists 
}
else 
{   
  //do whatever 
}
于 2012-12-05T22:36:46.997 に答える