0

だから私は、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;
        }
    }
4

1 に答える 1