Вход каждых данных изменяется с Платформой Объекта

29
задан Eike Pierstorff 28 February 2018 в 13:24
поделиться

4 ответа

Как насчет того, чтобы обработать Контекст. SavingChanges?

12
ответ дан Craig Stuntz 28 November 2019 в 01:48
поделиться

Наконец со справкой 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();

Поэтому прежде, чем сохранить изменения, мы открываем соединение объекта, вводим наш код (не закрывайте соединение в этой части!) и сохраняют наши изменения.

И не забывают! Это должно быть расширено для Ваших потребностей входа и должно быть хорошо протестировано, потому что это шоу только возможность!

10
ответ дан Biri 28 November 2019 в 01:48
поделиться

Вы попытались добавить хранимую процедуру к своей модели объекта?

3
ответ дан Davy Landman 28 November 2019 в 01:48
поделиться

Мы должны были решить эту проблему другим способом.

  • Наследовать класс от созданного вами класса контейнера сущностей
  • Сделать базовый класс сущности абстрактным. Вы можете сделать это путем частичного определения класса в отдельном файле
  • В унаследованном классе скройте метод SavingChanges своим собственным, используя ключевое слово new в определении метода
  • В вашем методе SavingChanges:

    1. a, open соединение объекта
    2. выполняет хранимую процедуру контекста пользователя с помощью ebtityclient
    3. call base.SaveChanges ()
    4. закрывает соединение объекта

Тогда в вашем коде вы должны использовать унаследованный класс.

2
ответ дан 28 November 2019 в 01:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: