sql >> データベース >  >> RDS >> Sqlserver

EntityFrameworkがテンポラルテーブルで機能しない

    この問題には2つの解決策があります:

    1. EDMXデザイナの列のプロパティウィンドウで、StoreGeneratedPatternを変更します PERIODで 列(私の場合はValidFromとValidTo)をidentityにする 。 identityを使用した単なる挿入ではなく、EFが挿入と更新の値を更新するため、IDは計算よりも優れています。
    2. IDbCommandTreeInterceptorを作成します 期間列を削除するための実装。これは、モデルに新しいテーブルを追加するときに追加の作業を必要としないため、私の推奨するソリューションです。

    これが私の実装です:

    using System.Data.Entity.Infrastructure.Interception; 
    using System.Data.Entity.Core.Common.CommandTrees; 
    using System.Data.Entity.Core.Metadata.Edm; 
    using System.Collections.ObjectModel;
    
    internal class TemporalTableCommandTreeInterceptor : IDbCommandTreeInterceptor
    {
        private static readonly List<string> _namesToIgnore = new List<string> { "ValidFrom", "ValidTo" };
    
        public void TreeCreated(DbCommandTreeInterceptionContext interceptionContext)
        {
            if (interceptionContext.OriginalResult.DataSpace == DataSpace.SSpace)
            {
                var insertCommand = interceptionContext.Result as DbInsertCommandTree;
                if (insertCommand != null)
                {
                    var newSetClauses = GenerateSetClauses(insertCommand.SetClauses);
    
                    var newCommand = new DbInsertCommandTree(
                        insertCommand.MetadataWorkspace,
                        insertCommand.DataSpace,
                        insertCommand.Target,
                        newSetClauses,
                        insertCommand.Returning);
    
                    interceptionContext.Result = newCommand;
                }
    
                var updateCommand = interceptionContext.Result as DbUpdateCommandTree;
                if (updateCommand != null)
                {
                    var newSetClauses = GenerateSetClauses(updateCommand.SetClauses);
    
                    var newCommand = new DbUpdateCommandTree(
                        updateCommand.MetadataWorkspace,
                        updateCommand.DataSpace,
                        updateCommand.Target,
                        updateCommand.Predicate,
                        newSetClauses,
                        updateCommand.Returning);
    
                    interceptionContext.Result = newCommand;
                }
            }
        }
    
        private static ReadOnlyCollection<DbModificationClause> GenerateSetClauses(IList<DbModificationClause> modificationClauses)
        {
            var props = new List<DbModificationClause>(modificationClauses);
            props = props.Where(_ => !_namesToIgnore.Contains((((_ as DbSetClause)?.Property as DbPropertyExpression)?.Property as EdmProperty)?.Name)).ToList();
    
            var newSetClauses = new ReadOnlyCollection<DbModificationClause>(props);
            return newSetClauses;
        }
    }
    

    コンテキストを使用する前に、コード内の任意の場所で次のコマンドを実行して、このインターセプターをEFに登録します。

    DbInterception.Add(new TemporalTableCommandTreeInterceptor());
    


    1. Springのストアドプロシージャ-プロシージャから返される結果は常に空です

    2. MySQLクエリはphpmyadminで機能しますが、phpでは機能しません

    3. OracleInstantClientDYLD_LIBRARY_PATHエラー

    4. 特にパフォーマンスに関して、GUIDを主キーとして使用するためのベストプラクティスは何ですか?