PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

ईएफ कोर में चयन के लिए अद्यतन को कैसे कार्यान्वित करें

यह काम मेरे लिए SQLServer (कोई परीक्षण async विधियाँ नहीं) का उपयोग कर रहा है:

सबसे पहले, एक DbCommandInterceptor बनाएं (मैंने HintInterceptor.cs कहा)

using System;
using System.Data.Common;
using System.Data.Entity.Infrastructure.Interception;
using System.Text.RegularExpressions;

public class HintInterceptor : DbCommandInterceptor
{
    private static readonly Regex _tableAliasRegex = new Regex(@"(?<tableAlias>FROM +(\[.*\]\.)?(\[.*\]) AS (\[.*\])(?! WITH \(*HINT*\)))", RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.Compiled);

    [ThreadStatic]
    public static string HintValue;

    private static string Replace(string input)
    {
        if (!String.IsNullOrWhiteSpace(HintValue))
        {
            if (!_tableAliasRegex.IsMatch(input))
            {
                throw new InvalidProgramException("Não foi possível identificar uma tabela para ser marcada para atualização(forupdate)!", new Exception(input));
            }
            input = _tableAliasRegex.Replace(input, "${tableAlias} WITH (*HINT*)");
            input = input.Replace("*HINT*", HintValue);
        }
        HintValue = String.Empty;
        return input;
    }

    public override void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
    {
        command.CommandText = Replace(command.CommandText);
    }

    public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
        command.CommandText = Replace(command.CommandText);
    }
}

तो Web.config में अपना इंटरसेप्टर वर्ग पंजीकृत करें

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
<interceptors> 
  <interceptor type="Full.Path.Of.Class.HintInterceptor, Dll.Name" />
</interceptors>
</entityFramework>

अब मैं HintExtension नामक एक स्थिर वर्ग बनाता हूं

public static class HintExtension
{
    public static IQueryable<T> WithHint<T>(this IQueryable<T> set, string hint) where T : class
    {
        HintInterceptor.HintValue = hint;
        return set;
    }
    public static IQueryable<T> ForUpdate<T>(this IQueryable<T> set) where T : class
    {
        return set.WithHint("UPDLOCK");
    }
}

बस इतना ही, मैं डेटाबेस लेनदेन के अंदर उपयोग कर सकता हूं जैसे:

using(var trans = context.Database.BeginTransaction())
{
        var query = context.mydbset.Where(a => a.name == "asd").ForUpdate();
        // not locked yet
        var mylist = query.ToList();
        // now are locked for update
        // update the props, call saveChanges() and finally call commit ( or rollback)
        trans.Commit();
        // now are unlocked
}

मेरी अंग्रेजी के लिए क्षमा करें, मुझे आशा है कि मेरे उदाहरण से मदद मिलेगी।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. नेस्टेड जॉइन के साथ row_to_json() का उपयोग करना

  2. SQL स्थिति:42883, कोई फ़ंक्शन दिए गए नाम और तर्क प्रकारों से मेल नहीं खाता। लेकिन वह कार्य वास्तव में मौजूद है

  3. INNER की गिनती और सभी वस्तुओं की गिनती की गिनती कैसे प्राप्त करें?

  4. PostgreSQL डेटाबेस में सीमा से बाहर पूर्णांक

  5. त्रुटि:कॉलम मौजूद नहीं है