API

даря помощи, которую я получил от Zambonee нанаписать запрос, который применяется ко всей базе данных вместо таблицы

Используя EF, я пишу запрос, который возвращает userId из таблицы aspNet_Users. Затем я использую этот идентификатор для удаления записей в членстве, userINroles & users .... Однако userId, который возвращает запрос, является неправильным значением ... и я подключился к правильной БД, iv проверил connectionString и протестировал другие данные.

    using (DEntities Context = DAOHelper.GetObjectContext<DEntities>())
{
Guid aspUserIdToRemove = Context.ExecuteStoreQuery<string>("Select UserId FROM aspnet_Users where UserName LIKE '%" + userName + "%'").ElementType.GUID;

string aspUserId = aspUserIdToRemove.ToString();
aspUserId = aspUserId.Replace("{", string.Empty);
aspUserId = aspUserId.Replace("}", string.Empty);

Context .ExecuteStoreCommand("DELETE FROM aspnet_Membership where UserId = '" + aspUserId + "'");
Context .ExecuteStoreCommand("DELETE FROM aspnet_UsersInRoles where UserId = '" + aspUserId + "'");
Context .ExecuteStoreCommand("DELETE FROM aspnet_Users where UserId = '" + aspUserId + "'");

aspUserIdToRemove возвращает {296afbff-1b0b-3ff5-9d6c-4e7e599f8b57}, когда он должен вернуть {31E62355-8AE2-4C44-A270-2F185581B742} ...

{296afbff-1b0b-3ff5-9d6c-4e7e599f8b57} даже не существует в БД ... у кого-нибудь есть идеи, что не так? Спасибо

Просто для подтверждения того, что вы находитесь в одной БД, я делаю дальнейшие команды удаления для разных таблиц и подтверждаю, что они удалены.

Исходя из комментариев -

var s = dnnEntitiesDbContext.ExecuteStoreQuery<string>("Select UserId FROM aspnet_Users where UserName LIKE '%" + userName + "%'");

s.elementtype.GUID содержит 296afbff-1b0b-3ff5-9d6c-4e7e599f8b57

но s.base.elementType.baseType.Guid возвращает идентификатор GUID diff'а 81c5f .... но нет признаков того, что я ищу

 John08 сент. 2017 г., 03:45
@Dai Я работаю над существующим кодом, созданным другим пользователем. Я пытаюсь исправить ошибку ...
 John08 сент. 2017 г., 03:13
да, когда я запускаю Select UserId FROM aspnet_Users, где UserName LIKE "% JimBob%" в SQL возвращает 31E62355-8AE2-4C44-A270-2F185581B742
 meisen9908 сент. 2017 г., 03:24
Можно ли просто оставить GUID в качестве строкового значения, вместо того, чтобы пытаться преобразовать его в тип Guid (который вы затем конвертируете обратно в строку)? Мне интересно, если есть проблема с приведением между строками и GUID между SQL и C #.
 meisen9908 сент. 2017 г., 02:59
Просто чтобы уточнить - выдает ли оператор «Select UserId FROM aspnet_Users, где UserName LIKE«% »+ userName +«% »« верный GUID при запуске из консоли?
 Dai08 сент. 2017 г., 03:23
Вы используете EF неправильно - вам следует избегатьExecuteStoreQuery и вместо этого используйте строго типизированный API на основе модели, и если вам абсолютно необходимо использоватьExecuteStoreQuery тогдаИСПОЛЬЗУЙТЕ ПАРАМЕТРИРОВАННЫЕ ЗАПРОСЫ! - ваш код уязвим для атак SQL-инъекций.

Ответы на вопрос(1)

Вы можете иметь некоторое недопонимание оExecuteStoreQuery<T>, он вернетType Вы указали. В вашем случае он вернетсяstring назад.

Guid aspUserIdToRemove = Context.ExecuteStoreQuery<string>("Select UserId FROM aspnet_Users where UserName LIKE '%" + userName + "%'").ElementType.GUID;

С этим утверждениемExecuteStoreQuery<string> вернетstring типUserId, а затем получитьGUID изElementType, но нетGUID изпользователей

Чтобы решить это, вам просто нужно использовать

string aspUserIdToRemove = Context.ExecuteStoreQuery<string>("Select UserId FROM aspnet_Users where UserName LIKE '%" + userName + "%'");

Более того, вы можете избежать внедрения SQL и использовать параметр

string aspUserIdToRemove = Context.ExecuteStoreQuery<string>("Select UserId FROM aspnet_Users where UserName LIKE '%{0}%'", userName);

Подробности вы можете проверитьAPI

КакaspUserIdToRemove это строка, вам не нужно использовать.ToString() в теме. Однако у меня недостаточно данных, возможно, вам нужно проверить, нужно ли вам экранировать '{}'.

Более того, из вашего комментария\ является escape-символом, если вы хотите заключить в строку, вы должны экранировать это с помощью\\ (API)

Ваш ответ на вопрос