همچنین اگر از FTS در SQL Server استفاده میکنید باید از accent insensitive collate استفاده کنید.
حذف اعراب از حروف و کلمات
همچنین اگر از FTS در SQL Server استفاده میکنید باید از accent insensitive collate استفاده کنید.
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection") ));
"ConnectionStrings": { "ConnectionTemplate": "Data Source=.;Initial Catalog={db_Name};Integrated Security=True", }
services.AddDbContext<ApplicationDbContext>((serviceProvider, dbContextBuilder) => { var connectionStringTemplate = Configuration.GetConnectionString("ConnectionTemplate"); var httpContextAccessor = serviceProvider.GetRequiredService<IHttpContextAccessor>(); var dbName = httpContextAccessor.HttpContext.Request.Headers["tenantId"].First(); var connectionString = connectionStringTemplate.Replace("{db_Name}", dbName); dbContextBuilder.UseSqlServer(connectionString); });
CATNETCmd /file:"I:\prog\bin\prog.dll" /search:"I:\prog" /report:"I:\prog\report.xsl" /rule:"J:\microsoft\cat.net\Rules"
CREATE TABLE accounts ( user_id INTEGER PRIMARY KEY, balance INTEGER NOT NULL );
INSERT INTO accounts(user_id, balance) VALUES (1, 300);
DECLARE @amount INT; SET @amount = ( SELECT balance FROM accounts WHERE user_id = 1 ); SELECT @amount as 'balance' UPDATE accounts SET balance = @amount - 100 WHERE user_id = 1; SELECT balance as 'balance after shopping' FROM accounts WHERE user_id = 1
var account1 = context.Accounts.First(x => x.UserId == 1); account1.Balance -= 100; context.SaveChanges();
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
WAITFOR TIME '13:47:00'; SET NOCOUNT, XACT_ABORT ON; BEGIN TRAN; DECLARE @amount INT; SET @amount = ( SELECT balance FROM accounts WITH (UPDLOCK, HOLDLOCK) WHERE user_id = 1 ); SELECT @amount as 'initial user''s balance' UPDATE accounts SET balance = @amount - 100 WHERE user_id = 1; SELECT balance as 'user''s balance after shopping 1' FROM accounts WHERE user_id = 1; COMMIT TRAN;
اگر مالک وب سایت شخصی هستید که در VPS و یا سرور اختصاصی آن را هاست نموده اید، حتما به بکاپ روزانه و حتی ساعتی از پایگاه داده نیاز خواهید داشت. ابزار SQL Server Job، این کار را برای شما به سادگی و ظرف چند دقیقه انجام خواهد داد.
ضمنا اگر به این نیاز دارید که بکاپهای خود را به صورت فایلی شامل تاریخ و ساعت ذخیره کنید، از این مطلب میتوانید کمک بگیرید.
[ServiceContract] public interface IService1 { [OperationContract] Order InsertOrder(); [OperationContract] void UpdateOrderWithoutRetrieving(Order order); [OperationContract] void UpdateOrderByRetrieving(Order order); }
public class Service1 : IService1 { public Order InsertOrder() { using (var context = new EFRecipesEntities()) { // remove previous test data context.Database.ExecuteSqlCommand("delete from [orders]"); var order = new Order { Product = "Camping Tent", Quantity = 3, Status = "Received" }; context.Orders.Add(order); context.SaveChanges(); return order; } } public void UpdateOrderWithoutRetrieving(Order order) { using (var context = new EFRecipesEntities()) { try { context.Orders.Attach(order); if (order.Status == "Received") { context.Entry(order).Property(x => x.Quantity).IsModified = true; context.SaveChanges(); } } catch (OptimisticConcurrencyException ex) { // Handle OptimisticConcurrencyException } } } public void UpdateOrderByRetrieving(Order order) { using (var context = new EFRecipesEntities()) { // fetch current entity from database var dbOrder = context.Orders .Single(o => o.OrderId == order.OrderId); if (dbOrder != null && // execute concurrency check StructuralComparisons.StructuralEqualityComparer.Equals(order.TimeStamp, dbOrder.TimeStamp)) { dbOrder.Quantity = order.Quantity; context.SaveChanges(); } else { // Add code to handle concurrency issue } } } }
class Program { static void Main(string[] args) { var service = new Service1Client(); var order = service.InsertOrder(); order.Quantity = 5; service.UpdateOrderWithoutRetrieving(order); order = service.InsertOrder(); order.Quantity = 3; service.UpdateOrderByRetrieving(order); } }
متد ()InsertOrder دادههای پیشین را حذف میکند، سفارش جدیدی میسازد و آن را در دیتابیس ثبت میکند. در آخر موجودیت جدید به کلاینت باز میگردد. موجودیت بازگشتی هر دو مقدار OrderId و TimeStamp را دارا است که توسط دیتابیس تولید شده اند. سپس در کلاینت از دو رویکرد نسبتا متفاوت برای بروز رسانی موجودیت استفاده میکنیم.
در رویکرد نخست، متد ()UpdateOrderWithoutRetrieving موجودیت دریافت شده از کلاینت را Attach میکند و چک میکند که مقدار فیلد Status چیست. اگر مقدار این فیلد "Received" باشد، فیلد Quantity را با EntityState.Modified علامت گذاری میکنیم و متد ()SaveChanges را فراخوانی میکنیم. EF دستورات لازم برای بروز رسانی را تولید میکند، که فیلد quantity را مقدار دهی کرده و یک عبارت where هم دارد که فیلدهای OrderId و TimeStamp را چک میکند. اگر مقدار TimeStamp توسط یک دستور بروز رسانی تغییر کرده باشد، بروز رسانی جاری با خطا مواجه خواهد شد. برای مدیریت این خطا ما بدنه کد را در یک بلاک try/catch قرار میدهیم، و استثنای OptimisticConcurrencyException را مهار میکنیم. این کار باعث میشود اطمینان داشته باشیم که موجودیت Order دریافت شده از متد ()InsertOrder تاکنون تغییری نکرده است. دقت کنید که در مثال جاری تمام خواص موجودیت بروز رسانی میشوند، صرفنظر از اینکه تغییر کرده باشند یا خیر.
رویکرد دوم نشان میدهد که چگونه میتوان وضعیت همزمانی موجودیت را پیش از بروز رسانی مشخصا دریافت و بررسی کرد. در اینجا میتوانید مقدار TimeStamp موجودیت را از دیتابیس بگیرید و آن را با مقدار موجودیت کلاینت مقایسه کنید تا وجود تغییرات مشخص شود. این رویکرد در متد ()UpdateOrderByRetrieving نمایش داده شده است. گرچه این رویکرد برای تشخیص تغییرات خواص موجودیتها و یا روابط شان مفید و کارآمد است، اما بهترین روش هم نیست. مثلا ممکن است از زمانی که موجودیت را از دیتابیس دریافت میکنید، تا زمانی که مقدار TimeStamp آن را مقایسه میکنید و نهایتا متد ()SaveChanges را صدا میزنید، موجودیت شما توسط کلاینت دیگری بروز رسانی شده باشد.
مسلما رویکرد دوم هزینه برتر از رویکرد اولی است، چرا که برای مقایسه مقادیر همزمانی موجودیت ها، یکبار موجودیت را از دیتابیس دریافت میکنید. اما این رویکرد در مواقعی که Object graphهای بزرگ یا پیچیده (complex) دارید بهتر است، چون پیش از ارسال موجودیتها به context در صورت برابر نبودن مقادیر همزمانی پروسس را لغو میکنید.