Как насчет того, чтобы обработать Контекст. SavingChanges?
Наконец со справкой Craig, вот подтверждение концепции. Требуется больше тестирования, но для первого взгляда это работает.
Сначала: Я составил две таблицы, один для данных один для входа.
-- This is for the data
create table datastuff (
id int not null identity(1, 1),
userid nvarchar(64) not null default(''),
primary key(id)
)
go
-- This is for the log
create table naplo (
id int not null identity(1, 1),
userid nvarchar(64) not null default(''),
datum datetime not null default('2099-12-31'),
primary key(id)
)
go
117-секундный: создайте триггер для вставки.
create trigger myTrigger on datastuff for insert as
declare @User_id int,
@User_context varbinary(128),
@User_id_temp varchar(64)
select @User_context = context_info
from master.dbo.sysprocesses
where spid=@@spid
set @User_id_temp = cast(@User_context as varchar(64))
declare @insuserid nvarchar(64)
select @insuserid=userid from inserted
insert into naplo(userid, datum)
values(@User_id_temp, getdate())
go
необходимо также создать триггер для обновления, которое будет сложно, потому что оно должно проверить каждое поле на измененное содержание.
таблица журнала и триггер должны быть расширены для хранения таблицы и поля, которое создается/изменяется, но я надеюсь, что Вы получили идею.
Треть: создайте хранимую процедуру, которая заполняет идентификатор пользователя к информации о контексте SQL
create procedure userinit(@userid varchar(64))
as
begin
declare @m binary(128)
set @m = cast(@userid as binary(128))
set context_info @m
end
go
, Мы готовы со стороной SQL. Здесь прибывает часть C#.
Создают проект и добавляют EDM к проекту. EDM должен содержать datastuff таблицу (или таблицы, которые необходимо наблюдать за изменениями), и SP.
Теперь делают что-то с объектом объекта (например, добавляют новый объект datastuff), и сцепитесь с событием SavingChanges.
using (testEntities te = new testEntities())
{
// Hook to the event
te.SavingChanges += new EventHandler(te_SavingChanges);
// This is important, because the context info is set inside a connection
te.Connection.Open();
// Add a new datastuff
datastuff ds = new datastuff();
// This is coming from a text box of my test form
ds.userid = textBox1.Text;
te.AddTodatastuff(ds);
// Save the changes
te.SaveChanges(true);
// This is not needed, only to make sure
te.Connection.Close();
}
Внутренняя часть SavingChanges мы вводим наш код для установки информации о контексте соединения.
// Take my entity
testEntities te = (testEntities)sender;
// Get it's connection
EntityConnection dc = (EntityConnection )te.Connection;
// This is important!
DbConnection storeConnection = dc.StoreConnection;
// Create our command, which will call the userinit SP
DbCommand command = storeConnection.CreateCommand();
command.CommandText = "userinit";
command.CommandType = CommandType.StoredProcedure;
// Put the user id as the parameter
command.Parameters.Add(new SqlParameter("userid", textBox1.Text));
// Execute the command
command.ExecuteNonQuery();
Поэтому прежде, чем сохранить изменения, мы открываем соединение объекта, вводим наш код (не закрывайте соединение в этой части!) и сохраняют наши изменения.
И не забывают! Это должно быть расширено для Ваших потребностей входа и должно быть хорошо протестировано, потому что это шоу только возможность!
Вы попытались добавить хранимую процедуру к своей модели объекта?
Мы должны были решить эту проблему другим способом.
В вашем методе SavingChanges:
Тогда в вашем коде вы должны использовать унаследованный класс.