مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

مهدی الهی

عضویت از 1396/07/29

عملیات بر روی دو دیتابیس هم زمان در GenericRepository

  • چهارشنبه 24 بهمن 1397
  • 13:10
تشکر میکنم

سلام 
دو دیتابیس دارم که هر دو شبیه به هم هستند 
میخواهم در GenericRepository ,وقتی داده ای را مثلا رکوردی را اضافه کرد در دیتابیس دوم هم ذخیره بشه  ولی وقتی هر برای هر دو Add میزارم  مثل کد پائین فقط بر روی دیتابیس اول اعمال میشه 
امکانش نیست به این شکل هم زمان بر روی دوتابیس در یک GenericRepository   داده ها را تغییر داد ؟

مثلا برای Add

  public async Task AddAsync(T entity)
        {
            await _dbContext.Set<T>().AddAsync(entity);
            await SaveChangesAsync();

            await _secondContext.Set<T>().AddAsync(entity);
            await SaveChangesDb2Async();
        }

پاسخ های این پرسش

تعداد پاسخ ها : 4 پاسخ
کاربر سایت

رضا نصیری

عضویت از 1392/10/01

  • چهارشنبه 24 بهمن 1397
  • 15:58

سلام.

عملی شدن یا عملی نشدن این کارتون رو تجربه نکردم تا نظر بدم ولی بخاطر یک سری هماهنگی داده هاتون خواستم کامنتی بنویسم.

فرض کنید ردیف جدید در یکی از دیتابیس ها ثبت شد ولی در دیتابیس بعدی با خطا مواجه شد؟؟تکلیف داده جدید چیه؟ این احتمال در آپدیت و حذف نیز قابل پیش بینی هست.

حالا برای حل اینکار Transaction هست ولی با یک DbContext.

توی Sp ها Transaction میشه نوشت که با 2 تا دیتابیس مجزا از هم, کار کنه ولی نمیدونم توی Ef هست یا نه.

کاربر سایت

محمد قاری

عضویت از 1395/02/07

  • چهارشنبه 24 بهمن 1397
  • 16:14

با سلام خدمت شما

برای این کار شما بهتره از Microsoft Sync Framework استفاده کنیدزیرا ممکنه در هنگام علملیات هاتون باعث ایجاد اختلاف در DB ها شوید و بسیار وقت گیر خواهد بود برطرف کردن آن ها و یا ایجاد کنترل های مربوط به مدیریت آن.

https://barnamenevisan.org/Articles/Article5170.html

ولی در صورتی که حتما نیاز به استفاده از روش خودتون رو دارید باید تمام فیلد های Auto incriment رو در دیتابیس دوم از این حالت خارج کنید تا تمام دیتا های ذخیره شده در Table اول به درستی در Table دوم ذخیره شوند.

public class GenericRepository<TEntity> where TEntity : class
    {
        private Context1 _context1;
        private Context2 _context2;

        public GenericRepository(Context1 context1, Context2 context2)
        {
            _context1 = context1;
            _context2 = context2;
        }

        public virtual void Insert(TEntity entity)
        {
            _context1.Set<TEntity>().Add(entity);
            _context1.SaveChanges();
            _context2.Set<TEntity>().Add(entity);
            _context2.SaveChanges();
        }
    }

کاربر سایت

AmirGhasemi

عضویت از 1392/02/25

  • پنجشنبه 25 بهمن 1397
  • 10:37

سلام

شما هم می تونی از Microsfot Sync Framework  استفاده کنی که راهکار خوبی است اما من نمی پسندم چون بشدت بار را سمت سرور و بالطبع در سمت کلاینت بالا می برد.

این کار را محول خود Sql server  کن! مثلا:

1- اگر کار حرفه ای میخواهی در HA  تنظیمات کن که هر رکوردی اضافه شد در دیتابیس دوم هم اضافه کند که کاری است بسیار متداول و مرسوم در پروژه های بزرگ

2- کار ساده تر اینکه یک Trigger  بسازی

کاربر سایت

مهدی الهی

عضویت از 1396/07/29

  • یکشنبه 28 بهمن 1397
  • 09:16

ببنید مثلا من میخواهم راس ساعتی خاصی مثلا 12 شب اطلاعات از دیتابیس اول در دیتابیس دوم بروزسانی بشه 
ولی اینکه در Asp.net Core نمیدونم به شکل باید انجام بدم 
قبلا با HostedService کار کردم که بهش میگی مثلا هر 1ساعت یک بار اینکارو رو انجام بده 
ولی من اینجا میخواهم راس ساعتی هر دو دیتابیس را sync کنه 
ممنون میشم کمک کنید 

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)