2

我在 ItemPrice 和 ItemPriceHistory 类之间有一对多的关系,我的映射如下:

public class ItemPrice 
{
    public long ID {get; set;}
    public List<ItemPriceHistory> ItemPriceHistories { get; set; }

    public ItemPrice()
    {
       ItemPriceHistories = new List<ItemPriceHistory>();
    }
}

public class ItemPriceHistory
{
    public ItemPrice ItemPrice { get; set; }
    public long ID {get; set;}
    public bool IsCurrent { get; set; }
}


modelBuilder.Entity<ItemPriceHistory>()
            .HasRequired(h => h.ItemPrice)
            .WithMany(p => p.ItemPriceHistories)
            .Map(h => h.MapKey("ItemPrice_ID"));

我正在尝试更新以前的 ItemPriceHistory 条目并尝试添加一个新的 ItemPriceHistory 条目。

    var dbItemPrice = repo.Std.Get<ItemPrice>()
                                    .SingleOrDefault(c => c.ID == id);                

            if (dbItemPrice == null)
            {
                return Request.CreateResponse(HttpStatusCode.NotFound);
            }                

            //query for matching ItemPriceHistory
            var dbPriceHistories = repo.Std.Get<ItemPriceHistory>()
                                    .Include(h=>h.ItemPrice, repo.Std)
                                    .Where(h => h.ItemPrice.ID == ItemPrice.ID)
                                    .OrderByDescending(h => h.ModifiedDate);

            #region new history entry

            var newHistoryEntry = new ItemPriceHistory();
            newHistoryEntry.IsCurrent = true;
            newHistoryEntry.ItemPrice = dbItemPrice;

            //copy the current pirce list and update it with new history entry
            var currentPriceHistoryList = dbPriceHistories.ToList();
            currentPriceHistoryList.ForEach(h => { h.IsCurrent = false; });
            currentPriceHistoryList.Add(newHistoryEntry);

            //new price list
            var newHistoryList = new List<ItemPriceHistory>();
            currentPriceHistoryList.ForEach(h => newHistoryList.Add(new ItemPriceHistory
                                            {
                                                ItemPrice = h.ItemPrice,
                                                IsCurrent = h.IsCurrent,
                                            }
                                    ));
            #endregion

            //delete current price histories
            dbItemPrice.ItemPriceHistories.Clear(); 


            // add histories to database
            newHistoryList.ForEach(h => dbItemPrice.ItemPriceHistories.Add(h));

            Context.SaveChanges();

当它调用 SaveChanges() 时,我收到以下错误:

{“保存不为其关系公开外键属性的实体时发生错误。EntityEntries 属性将返回 null,因为无法将单个实体标识为异常源。通过公开可以更轻松地在保存时处理异常实体类型中的外键属性。有关详细信息,请参阅 InnerException。"}

InnerException: {“来自‘ItemPriceHistory_ItemPrice’AssociationSet 的关系处于‘已删除’状态。给定多重约束,相应的‘ItemPriceHistory_ItemPrice_Source’也必须处于‘已删除’状态。”}

我不想删除我的ItemPrice_Source. 我只想删除当前ItemPriceHistories并更新以前的ItemPriceHistories并添加新ItemPriceHistory条目。如何安全地更新ItemPriceHistory条目以及新ItemPriceHistory条目?

谢谢!

4

2 回答 2

0

我使用了一个应该适合您的 STD 通用存储库类的示例。看起来你正在使用这种模式。

你有没有尝试过类似的东西

 public virtual IQueryable<T> GetList(Expression<Func<T, bool>> predicate, bool withTracking = false)
    {
        if (withTracking)
            return QuerySet.Where(predicate);
        return QuerySet.Where(predicate).AsNoTracking();
    }


//    then
var iph_list = RepItemPriceHist.GetList(h=>h.ItemPrice.Id == VarID)

 //  psuedo code... foreach history entity entitity.Iscurrent = false;

所以现在这些实体应该由 statemanager 更改和管理。添加新条目....

// add histories to database
          newHistoryList.ForEach(h => dbItemPrice.ItemPriceHistories.Add(h));
 Context.SaveChanges();

我不明白您为什么需要清除集合您是否更新现有记录并添加新记录?祝你好运

于 2012-12-29T11:07:08.107 回答
0

你不能只加载ItemPrice 包括所有当前ItemPriceHistories的,然后将IsCurrent这些历史的标志设置为false并添加一个新的历史IsCurrent = true吗?更改跟踪应该更新当前历史并将新的历史插入数据库:

var dbItemPrice = repo.Std.Get<ItemPrice>()
    .Include(i => i.ItemPriceHistories, repo.Std)
    .SingleOrDefault(i => i.ID == id);                

if (dbItemPrice == null)
    return Request.CreateResponse(HttpStatusCode.NotFound);

foreach (var history in dbItemPrice.ItemPriceHistories)
    history.IsCurrent = false;

dbItemPrice.ItemPriceHistories.Add(new ItemPriceHistory { IsCurrent = true });

Context.SaveChanges();
于 2012-12-29T15:17:40.020 回答