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

Entity Framework Code First と SQL Server 2012 シーケンス

    これが役立つかどうかはわかりませんが、最初にコードを使用して監査ログ証跡を作成した方法です。以下は、DbContext から継承するクラスにコーディングされています。

    私のコンストラクターには次のものがあります

    IObjectContextAdapter objectContextAdapter = (this as IObjectContextAdapter);
    objectContextAdapter.ObjectContext.SavingChanges += SavingChanges;
    

    これは、以前に配線された変更の保存方法です

    void SavingChanges(object sender, EventArgs e) {
            Debug.Assert(sender != null, "Sender can't be null");
            Debug.Assert(sender is ObjectContext, "Sender not instance of ObjectContext");
    
            ObjectContext context = (sender as ObjectContext);
            IEnumerable<ObjectStateEntry> modifiedEntities = context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
            IEnumerable<ObjectStateEntry> addedEntities = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added);
    
            addedEntities.ToList().ForEach(a => {
                //Assign ids to objects that don't have
                if (a.Entity is IIdentity && (a.Entity as IIdentity).Id == Guid.Empty)
                    (a.Entity as IIdentity).Id = Guid.NewGuid();
    
                this.Set<AuditLogEntry>().Add(AuditLogEntryFactory(a, _AddedEntry));
            });
    
            modifiedEntities.ToList().ForEach(m => {
                this.Set<AuditLogEntry>().Add(AuditLogEntryFactory(m, _ModifiedEntry));
            });
        }
    

    これらは、監査ログの詳細を構築するために以前に使用された方法です

    private AuditLogEntry AuditLogEntryFactory(ObjectStateEntry entry, string entryType) {
            AuditLogEntry auditLogEntry = new AuditLogEntry() {
                EntryDate = DateTime.Now,
                EntryType = entryType,
                Id = Guid.NewGuid(),
                NewValues = AuditLogEntryNewValues(entry),
                Table = entry.EntitySet.Name,
                UserId = _UserId
            };
    
            if (entryType == _ModifiedEntry) auditLogEntry.OriginalValues = AuditLogEntryOriginalValues(entry);
    
            return auditLogEntry;
        }
    
        /// <summary>
        /// Creates a string of all modified properties for an entity.
        /// </summary>
        private string AuditLogEntryOriginalValues(ObjectStateEntry entry) {
            StringBuilder stringBuilder = new StringBuilder();
    
            entry.GetModifiedProperties().ToList().ForEach(m => {
                stringBuilder.Append(String.Format("{0} = {1},", m, entry.OriginalValues[m]));
            });
    
            return stringBuilder.ToString();
        }
    
        /// <summary>
        /// Creates a string of all modified properties' new values for an entity.
        /// </summary>
        private string AuditLogEntryNewValues(ObjectStateEntry entry) {
            StringBuilder stringBuilder = new StringBuilder();
    
            for (int i = 0; i < entry.CurrentValues.FieldCount; i++) {
                stringBuilder.Append(String.Format("{0} = {1},",
                    entry.CurrentValues.GetName(i), entry.CurrentValues.GetValue(i)));
            }
    
            return stringBuilder.ToString();
        }
    

    これにより、問題の解決に役立つ方向性が示されることを願っています。




    1. 空のテーブルにインデックスを作成した後にデータを挿入しますか、それともOracleにデータを挿入した後に一意のインデックスを作成しますか?

    2. なぜこれがリソースID#2を返すのですか?

    3. ボタンをクリックするとSQLクエリが起動しますか?

    4. Knexrawを使用してMySQLでストアドプロシージャを作成する方法