EF Core 内存数据库更新值而不调用 DbContext SaveChanges

问题描述

我遇到了以前从未遇到过的问题。在使用 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 (将#修改为@)