Наконец, с помощью Крейга, вот подтверждение концепции. Нужно больше тестировать, но на первый взгляд это работает.
Первый: я создал две таблицы, одну для данных, другую для регистрации.
-- 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
Второй: создать триггер для вставки.
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();
Поэтому перед сохранением изменений мы открываем соединение объекта, внедряем наш код (не закрывать соединение в этой части!) И сохраняем наши изменения.
И не забудь! Это должно быть расширено для ваших потребностей регистрации и должно быть хорошо протестировано, потому что это показывает только возможность!