При получении идентификатора строки я обновил в SQL-сервере

Это позволяет Entity Framework создавать прокси-сервер вокруг виртуального свойства, чтобы свойство могло поддерживать ленивую загрузку и более эффективное отслеживание изменений. См. . Какие эффекты могут иметь ключевое слово virtual в Entity Framework 4.1. Код POCO First? для более подробного обсуждения.

Изменить, чтобы уточнить «создать прокси-сервер»: «создайте прокси-сервер». Я имею в виду конкретно то, что делает Entity Framework. Для платформы Entity Framework ваши свойства навигации должны быть помечены как виртуальные, чтобы поддерживать ленивую загрузку и эффективное отслеживание изменений. См. Требования к созданию прокси POCO . Entity Framework использует наследование для поддержки этой функции, поэтому она требует, чтобы определенные свойства были помечены как виртуальные в вашем базовом классе POCOs. Он буквально создает новые типы, которые происходят из ваших типов POCO. Таким образом, ваш POCO действует как базовый тип для динамически созданных подклассов Entity Framework. Это то, что я имел в виду под «созданием прокси-сервера».

Динамически созданные подклассы, созданные Entity Framework, становятся очевидными при использовании Entity Framework во время выполнения, а не во время статической компиляции. И только если вы включите ленивые функции загрузки или изменения отслеживания Entity Framework. Если вы решите никогда не использовать ленивые функции отслеживания загрузки или изменения в Entity Framework (который не является стандартным), вам не нужно объявлять какие-либо свойства навигации как виртуальные. Затем вы отвечаете за загрузку этих свойств навигации самостоятельно, используя то, что Entity Framework называет «нетерпеливой загрузкой», или вручную извлекает связанные типы для нескольких запросов к базе данных. Однако вы можете и должны использовать ленивые функции загрузки и изменения отслеживания для ваших свойств навигации во многих сценариях.

Если вы должны были создать отдельный класс и пометить свойства как виртуальные, а просто создать и использовать экземпляры этих классов в своем собственном приложении, полностью вне сферы действия Entity Framework, то ваши виртуальные свойства не будут Я ничего не выиграю.

Изменить, чтобы описать, почему свойства будут помечены как виртуальные

. Такие свойства, как:

 public ICollection RSVPs { get; set; }

Не являются полями и не должны рассматриваться как таковые. Они называются геттерами и сеттерами, а во время компиляции они преобразуются в методы.

//Internally the code looks more like this:
public ICollection get_RSVPs()
{
    return _RSVPs;
}

public void set_RSVPs(RSVP value)
{
    _RSVPs = value;
}

private RSVP _RSVPs;

Вот почему они помечены как виртуальные для использования в Entity Framework, что позволяет динамически созданным классам переопределять внутренние функции get и set. Если ваши свойства getter / setters для навигации работают для вас в вашем использовании Entity Framework, попробуйте пересмотреть их только на свойства, перекомпилировать и посмотреть, сможет ли Entity Framework функционировать должным образом:

 public virtual ICollection RSVPs;

22
задан Bob The Janitor 22 October 2009 в 23:02
поделиться

3 ответа

@@ identity и scope_identity () передадут вам идентификатор новой строки, т.е. после вставки. После обновления идентификатор строки будет ... @Customer_ID или @Handle_Id? Если это другое поле, вы должны использовать предложение OUTPUT для возврата идентификатора обновленной строки:

UPDATE ITS2_UserNames  
SET AupIp = @AupIp  
OUTPUT INSERTED.PrimaryKeyID
WHERE @Customer_ID = TCID AND @Handle_ID = ID
53
ответ дан 29 November 2019 в 04:04
поделиться

Требуемый, чтобы упомянуть здесь, что, если Вы хотите взять первичный ключ затронутой строки в переменной затем, можно использовать ВЫХОДНОЙ пункт, который может поместить это в табличную переменную. Выполнитесь ниже операторов, например...

CREATE TABLE ItemTable (идентификатор ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ INT (1,1), Модель varchar (500) ПУСТОЙ УКАЗАТЕЛЬ, Цветной VARCHAR (50) пустой указатель)

INSERT INTO ItemTable (Модель, Цвет) ЗНАЧЕНИЯ ('SomeModel', 'Желтый')

INSERT INTO ItemTable (Модель, Цвет) ЗНАЧЕНИЯ ('SomeModel', 'Красный')

INSERT INTO ItemTable (Модель, Цвет), ЗНАЧЕНИЯ ('SomeModel', 'Розовый')

, ОБЪЯВЛЯЮТ @LastUpdateID ТАБЛИЦУ (пустой указатель ItemID INT)

модель UPDATE ItemTable SET =, 'abc' ПРОИЗВЕЛА INSERTED.ID В @LastUpdateID ГДЕ Цвет = 'Красный'

ИЗБРАННЫЙ ItemID ОТ @LastUpdateID

enter image description here

0
ответ дан 29 November 2019 в 04:04
поделиться

Если вы хотите узнать записи, соответствующие этому обновлению, вы должны сделать a select с ним

Select IdColumn
From ITS2_UserNames
WHERE @Customer_ID = TCID AND @Handle_ID = ID  
-2
ответ дан 29 November 2019 в 04:04
поделиться
Другие вопросы по тегам:

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