2009-09-03 3 views
1

После прохождения через Entity Framework у меня есть несколько вопросов по реализации аудита в Entity Framework.Аудит в инфраструктуре Entity

Я хочу сохранить каждое значение столбца, которое создано или обновлено, в другую таблицу аудита.

  1. Прямо сейчас я звоню SaveChanges (ложь), чтобы сохранить записи в БД (до сих пор изменения в контексте не сбрасываются). Затем добавьте | измененные записи и цикл через GetObjectStateEntries. Но не знаете, как получить значения столбцов, где их значения заполнены хранимым proc. т. е. создан, модифицирован и т.д.

  2. Ниже приведен пример кода, над которым я работаю.

    // Get the changed entires(ie, records) 
    IEnumerable<ObjectStateEntry> changes = context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified); 
    
    // Iterate each ObjectStateEntry(for each record in the update/modified collection) 
    foreach (ObjectStateEntry entry in changes) 
    { 
        // Iterate the columns in each record and get thier old and new value respectively 
        foreach (var columnName in entry.GetModifiedProperties()) 
        { 
         string oldValue = entry.OriginalValues[columnName].ToString(); 
         string newValue = entry.CurrentValues[columnName].ToString(); 
    
         // Do Some Auditing by sending entityname, columnname, oldvalue, newvalue 
        } 
    } 
    
    changes = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added); 
    
    foreach (ObjectStateEntry entry in changes) 
    { 
        if (entry.IsRelationship) continue; 
        var columnNames = (from p in entry.EntitySet.ElementType.Members 
             select p.Name).ToList(); 
    
        foreach (var columnName in columnNames) 
        { 
         string newValue = entry.CurrentValues[columnName].ToString(); 
    
         // Do Some Auditing by sending entityname, columnname, value 
        } 
    } 
    
+0

Это не очень понятно, что вы ищете здесь- то, что именно вы хотите сделать, что вы не знаю, как это сделать? –

+0

Я хочу выполнить аудит (вставка имени таблицы/имени объекта, имени столбца, значения в таблице аудита при любых изменениях для данного объекта) –

ответ

1

Здесь у вас есть два основных варианта:

  • сделать это на уровне базы данных
  • ли это в C# код

Делать это в базе данных уровень, означает использование триггеров. В этом случае нет разницы, если вы используете корпоративную библиотеку или другую технологию доступа к данным.

Чтобы сделать это в коде C#, вы должны добавить таблицу журнала в свою базу данных и записать изменения в таблицу журналов. При сохранении изменений будут сохранены как изменения данных, так и информация, которую вы написали в таблице журналов.

0

Вы вставляете новую запись с помощью хранимой процедуры? Если нет (т. Е. Вы новичок в объекте, задаете значения, вставляете при отправке и затем сохраняете изменения, новый идентификатор объекта будет автоматически загружен в свойство id созданного вами объекта. Если вы используете сохраненный proc для вставки то вам необходимо вернуть @@ IDENTITY из прока в качестве возвращаемого значения

EX:.

StoreDateContext db = new StoreDataContext(connString); 
Product p = new Product(); 
p.Name = "Hello Kitty Back Scratcher"; 
p.CategoryId = 5; 
db.Products.Add(p); 
try 
{ 
    db.SaveChanges(); 
    //p.Id is now set 
    return p.Id; 
} 
finally 
{ 
    db.Dispose; 
} 
Смежные вопросы