Как определить модель данных как переменную SQL, а не таблицу или представление в EF Core?C#

Место общения программистов C#
Ответить
Anonymous
 Как определить модель данных как переменную SQL, а не таблицу или представление в EF Core?

Сообщение Anonymous »

Я не могу выяснить, правильно ли я определил модель данных как переменную SQL, а не таблицу или представление, в EF Core, потому что хранящаяся процедура SQL Server и веб -приложение Blazor успешно общаются друг с другом. < /p>

Я использую SQL Server 2017 и .NET 9, здесь My Model:
P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> Pre Server 2017 и .NET 9, здесь. class = "lang-cs prettyprint-override">

Код: Выделить всё

[Keyless]
public class SqlOutput
{
[Column("SP_OUTPUT")]
public string? SpOutput { get; set; }
}
А вот как я установил модель данных sqloutput в DBContext :

Код: Выделить всё

public DbSet SqlOutput { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasNoKey()
.ToView(null);
}
Я ожидал, что EF Core рассматривает заданную модель данных как переменную запись из хранимой процедуры, а не как объект таблицы или представление.

Код: Выделить всё

CREATE PROCEDURE myStoredProcedure
@id INT,
@random_text VARCHAR(50),
@key VARCHAR(100)
AS
BEGIN
SET NOCOUNT ON;

DECLARE @successful VARCHAR(20) = 'SUCCESSFUL';

IF @key = 'MOD_REC'
BEGIN

UPDATE myDB.dbo.myTable
SET random_text = @random_text
WHERE id = @id AND disable = 0

IF @@ROWCOUNT > 0
BEGIN

SELECT @successful AS SP_OUTPUT

END

ELSE
BEGIN

SELECT NULL AS SP_OUTPUT

END

END
END
< /code>
В этих следующих фрагментах C# кода я изначально называю метод со своей страницы Razor таким образом: < /p>
SqlOutput? output = await SomeClass.SomeMethod("myStoredProcedure", id, anotherDataModel?.RandomText, "MOD_REC");
somemethod определяется как,

Код: Выделить всё

public async Task SomeMethod(string spName, params object?[] parameters) {...}
< /code>
, поскольку я стремлюсь свести к минимуму условно -исходную код, но все же гарантируя, что он может обрабатывать нулевые типы вместе с другими типами данных в объекте  Single < /em> Params? SQLParameter [] 
, чья длина я определена на основе объекта Params? [] длины, а также на основе соответствующей определения хранимой процедуры.

Код: Выделить всё

var paramDefs = new (string Name, SqlDbType Type, int? Size)[]
{
("id", SqlDbType.Int, null),
("random_text", SqlDbType.VarChar, 50),
("key", SqlDbType.VarChar, 100)
};
и я затем передаю параметры методу с помощью типа SQLParameter [] возврата в формат выражения коллекции:

Код: Выделить всё

return [.. paramDefs
.Select((def, i) =>
{
var param = def.Size is null
? new SqlParameter(def.Name, def.Type)
: new SqlParameter(def.Name, def.Type, def.Size.Value);

param.Value = parameters[i] ?? DBNull.Value;
return param;
})];
< /code>
Я инициализировал его таким образом: < /p>
public static SqlParameter[] SomeStaticMethod((string Name, SqlDbType Type, int? Size)[] paramDefs, params object?[] parameters) {...}
, а затем я интерполировал эти свойства из somestaticmethod с $ "exec {spname}" , чтобы получить соответствующий экземпляр formattablestring с помощью Spectame :

pre Class = "lang-csle- Praite-cole-cs.

Код: Выделить всё

public static FormattableString SomeOtherStaticMethod(string spName, SqlParameter[] sqlParameters) {
return sqlParameters.Length switch
{
1 => $"EXEC {spName} {sqlParameters[0]}",
2 => $"EXEC {spName} {sqlParameters[0]}, {sqlParameters[1]}",
3 => $"EXEC {spName} {sqlParameters[0]}, {sqlParameters[1]}, {sqlParameters[2]}",
_ => throw new ArgumentException("Too many parameters provided."),
};
}
Интересно, что приведенный выше код заключается в том, что операторы Switch рефактируются и в формат выражения сбора, поэтому заслужите команду .net для этого :).
Использование какого-то ComeTherStaticMethod returned antemple, я инициализировал его:
Praite-qued-aeprinde-uprinde-uprede-

Код: Выделить всё

FormattableString sqlParam = SomeStaticClass.SomeOtherStaticMethod(spName, sqlParameter);

var result = await _context.SqlOutput
.FromSql(sqlParam)
.ToListAsync();

return result.FirstOrDefault();
В этом отношении сценарий ожидаемого обновления выполняется должным образом, что означает, что обновляет или не обновляет соответствующие записи, как и ожидалось. Однако ответ, который должен быть успешным или null , не то, что я получаю. Вместо этого он дает этот результат из раздела переменных во время отладки с использованием точки останова:


, которые можно использовать для меня, есть ли, что это может быть следующим образом. преодолеть:

[*] Существует огромная возможность для получения множественных операторов вставки SQL и обновления в одной транзакции (например, начинайте Tran ... Commit ).


< /li>
< /ul>

Осторожно Корректировки мне нужно сделать для этих вариантов использования? />
Примечание. Я ограничил модель данных с помощью сохраненных вызовов процедур. Вы можете спросить, почему я это делаю; Это просто потому, что я человек, который также несет ответственность за управление этими сценариями SQL в RDBMS, поэтому эта тема очень важна для меня, хотя существует крутой обходной путь, проходя глубокий поиск и имея тщательный анализ (к сожалению, я был запутан и немного разочарован). ценится!

Подробнее здесь: https://stackoverflow.com/questions/797 ... in-ef-core
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»