だから私は、1 つのデータベースからデータを選択し、オーサリング データベースの「出版」テーブルに含まれる情報に基づいて同一のデータベースを更新するアプリに取り組んでいます。「作成」コンテキストに接続されていない単一のオブジェクトを取得して、「配信」コンテキストに追加できるようにする必要があります。
現在、私は使用しています
object authoringRecordVersion = PublishingFactory.AuthoringContext.Set(recordType.Entity.GetType()).Find(record.RecordId);
object deliveryRecordVersion = PublishingFactory.DeliveryContext.Set(recordType.Entity.GetType()).Find(record.RecordId));
私の記録を返すために。次に、「deliveryRecordVersion」が null の場合、「authoringRecordVersion」を「PublishingFactory.DeliveryContext」に挿入する必要があります。ただし、そのオブジェクトは既に「PublishingFactory.AuthoringContext」に接続されているため、「PublishingFactory.DeliveryContext」で Add() メソッドを呼び出すことはできません。
アクセスできますPublishingFactory.AuthoringContext.Set(recordType.Entity.GetType()).AsNoTracking()
しかし、ここから必要な特定のレコードを取得する方法はありません。助言がありますか?
アップデート:
私は解決策を見つけたと信じています。.State = EntityState.Detached; を設定するときに間違ったオブジェクトを参照していたため、最初は機能しませんでした。これは、期待どおりに機能する完全に修正された方法です
private void PushToDelivery(IEnumerable<Mkl.WebTeam.UWManual.Model.Publication> recordsToPublish)
{
string recordEntity = string.Empty;
DbEntityEntry recordType = null;
// Loop through recordsToPublish and see if the record exists in Delivery. If so then 'Update' the record
// else 'Add' the record.
foreach (var record in recordsToPublish)
{
if (recordEntity != record.Entity)
{
recordType = PublishingFactory.DeliveryContext.Entry(ObjectExt.GetEntityOfType(record.Entity));
}
if (recordType == null)
{
continue;
////throw new NullReferenceException(
//// string.Format("Couldn't identify the object type stored in record.Entity : {0}", record.Entity));
}
// get the record from the Authoring context from the appropriate type table
object authoringRecordVersion = PublishingFactory.AuthoringContext.Set(recordType.Entity.GetType()).Find(record.RecordId);
// get the record from the Delivery context from the appropriate type table
object deliveryRecordVersion = PublishingFactory.DeliveryContext.Set(recordType.Entity.GetType()).Find(record.RecordId);
// somthing happened and no records were found meeting the Id and Type from the Publication table in the
// authoring table
if (authoringRecordVersion == null)
{
continue;
}
if (deliveryRecordVersion != null)
{
// update record
PublishingFactory.DeliveryContext.Entry(deliveryRecordVersion).CurrentValues.SetValues(authoringRecordVersion);
PublishingFactory.DeliveryContext.Entry(deliveryRecordVersion).State = EntityState.Modified;
PublishingFactory.DeliveryContext.SaveChanges();
}
else
{
// insert new record
PublishingFactory.AuthoringContext.Entry(authoringRecordVersion).State = EntityState.Detached;
PublishingFactory.DeliveryContext.Entry(authoringRecordVersion).State = EntityState.Added;
PublishingFactory.DeliveryContext.SaveChanges();
}
recordEntity = record.Entity;
}
}