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”并将其写入我的数据库。棘手的部分是任何数量的列表都可能报告给相同的列表数据。所以当我添加或更新一个 ThingWithListings 时,我需要查看一个 ListingData 是否已经存在,如果存在,就使用那个。

我是 EF 的新手,所以我一直在使用作者 Vickers 的文章中的 AddOrUpdate 显然,这不适用于这种情况,所以我尝试了一天左右来找出正确的方法做这个。我会把我主要失败尝试的所有故事都告诉你,希望有人能告诉我正确的方法。

4

3 回答 3

0

我假设除了Data对象引用之外,Listing 类中还有原始外键字段listing_id。如果没有,我建议添加它。

您可以从获取listing_id列表或数组中的现有 s 开始。这节省了以后大量的数据库往返。

那么这个过程真的很简单:对于每个Listing到达的对象,检查它是否listing_id出现在预取列表中:

  • 如果是这样,什么都不做ListingData- 只需添加(或更新)Listing,包括listing_id属性。
  • 如果没有,添加和Listing设置对象,都作为新的(添加的)对象。EF 将设置密钥。Listing.DataListingData

(请注意,这假设没有并发用户修改 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 回答