问题描述
我遇到了以前从未遇到过的问题。在使用 EF Core 内存数据库的测试中,即使未调用 SaveChanges
,也会修改子属性。我知道内置内存数据库的局限性,但我不希望在没有 SaveChanges
的情况下保存值。
- 它不是关系数据库。
- 它不支持交易。
- 它无法运行原始 SQL 查询。
- 未针对性能进行优化
https://docs.microsoft.com/en-us/ef/core/testing/#approach-3-the-ef-core-in-memory-database
示例类:
public class Text
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[MaxLength(512)]
public string Description { get; set; }
public List<QuestionText> QuestionTexts { get; set; } = new List<QuestionText>();
}
public class Question
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public List<QuestionText> QuestionTexts { get; set; } = new List<QuestionText>();
}
public class QuestionText
{
public int QuestionId { get; set; }
public Question Question { get; set; }
public int TextId { get; set; }
public Text Text { get; set; }
}
xUnit 测试:
[Fact]
public void Test()
{
var dbContextOptions = new DbContextOptionsBuilder<ApplicationDbContext>()
.UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
.Options;
var dbContext = new ApplicationDbContext(dbContextOptions);
var description1 = "Description 1";
var description2 = "Description 2";
var text1 = new Text()
{
Id = 1,Description = description1
};
var questionText1 = new QuestionText()
{
Text = text1
};
var text2 = new Text()
{
Id = 2,Description = description2,};
var questionText2 = new QuestionText()
{
Text = text2
};
var question = new Question();
question.QuestionTexts.Add(questionText1);
question.QuestionTexts.Add(questionText2);
dbContext.Questions.Add(question);
//Works
Assert.Null(dbContext.Questions.FirstOrDefault());
dbContext.SaveChanges();
//Works
Assert.NotNull(dbContext.Questions.FirstOrDefault());
//Works
Assert.Equal(2,dbContext.Questions.FirstOrDefault().QuestionTexts.Count);
var question2 = dbContext.Questions.FirstOrDefault();
question2.QuestionTexts = question.QuestionTexts.Where(x => x.Text.Id == 1).ToList();
//Only one QuestionTexts left even though no save has been performed
Assert.Equal(2,dbContext.Questions.FirstOrDefault().QuestionTexts.Count);
dbContext = new ApplicationDbContext(dbContextOptions);
//Question is till there but QuestionTexts are 0
Assert.Equal(2,dbContext.Questions.FirstOrDefault().QuestionTexts.Count);
}
这是预期的结果吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)