У меня есть тестовый проект в Visual Studio 2019, тестирующий C# код для вставки / обновления / выбора данных с использованием SQL Тестовой базы данных сервера.
- Я вставляю запись
- Я извлекаю новую запись, чтобы убедиться, что она есть, проверив, что мой результат не равен нулю и что данные совпадают с тем, что я вставил.
- Я обновляю эту запись, изменяя некоторые значения (я вижу, что обновление происходит успешно самостоятельно, просматривая базу данных в SQL Server Management Studio).
- Я снова получаю ту же запись, но моя проверка измененных данных не удалась, поскольку возвращаемая мной запись - это исходные вставленные данные, а не обновленные данные.
Что происходит? При нормальных условиях в моем приложении, если я получаю некоторые данные, которые я только что обновил, он возвращает правильные данные. Только в этом тестовом сценарии я получаю старые данные.
Вот код теста:
[TestMethod]
public void CRUDTest()
{
using (DefaultContext db = new DefaultContext())
{
int TestID = 1;
MyData.Create(db, TestID, "test1");
MyData resultFetch = MyData.Fetch(db, TestID);
Assert.IsNotNull(resultFetch);
Assert.AreEqual("test1", resultFetch.Name);
resultFetch = null;
MyData.Update(db, TestID, "updateTest1");
resultFetch = MyData.Fetch(db, TestID);
Assert.IsNotNull(resultFetch);
Assert.AreEqual("updateTest1", resultFetch.Name); // THIS TEST FAILS
resultFetch = null;
}
}
Тест не пройден для этого последнего утверждения. Значение resultFetch.Name по-прежнему является исходным значением «test1». Вот методы, которые тестируются:
public static bool Create(DefaultContext db, int Id, string Name)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("Id", new KeyValuePair<string, object>("int", Id));
dict.Add("Name", new KeyValuePair<string, object>("string", Name));
DbParameter[] parameters = new GetParameterMapper().GetParameters(dict, true);
int result = db.Database.ExecuteSqlCommand(@"
INSERT
INTO MyData (
[Id]
,[Name]
)
VALUES(
@Id
,@Name
);
SET @IDENTITY = SCOPE_IDENTITY();
SET @ROWCOUNT = @@ROWCOUNT;", parameters);
if (result > 0)
{
return true;
}
else
{
throw new Exception("Error: The record was not inserted in the database.");
}
}
public static bool Update(DefaultContext db, int ID, string Name)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("Id", new KeyValuePair<string, object>("int", Id));
dict.Add("Name", new KeyValuePair<string, object>("string", Name));
int result = db.Database.ExecuteSqlCommand(@"
UPDATE
MyData
SET[Name] = CASE WHEN @Name IS NOT NULL THEN @Name ELSE [Name] END
WHERE [Id] = @Id
", new GetParameterMapper().GetParameters(dict));
if (result > 0)
{
return true;
}
else
{
throw new Exception("Error: The record was not updated in the database.");
}
}
public static MyData Fetch(DefaultContext db, int Id)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("Id", new KeyValuePair<string, object>("int", Id));
var obj = db.MyData.FromSql<MyData>(@"
SELECT[Id]
,[Name]
FROM MyData
WHERE [Id] = @Id
", new GetParameterMapper().GetParameters(dict));
return obj.FirstOrDefault();
}