ItemPrice クラスと ItemPriceHistory クラスの間には 1 対多の関係があります。私のマッピングは以下のとおりです。
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
ですか?
ありがとう!