作爲EF 6.1到EF Core 2.0遷移的一部分,我添加了一個簡單測試來檢查併發令牌是否以同樣的方式工作。但我注意到,這取決於底層的數據庫提供者:它適用於SqlServer,但不適用於MS InMemory數據庫。使用Microsoft.EntityFrameworkCore.InMemory測試併發令牌
實體類是非常簡單的:
public class AcademicTermDate
{
public int AcademicTermDateID { get; set; }
public DateTime StartDate { get; set; } //but no end date, because it's derived in controcc and rederived here.
public bool Deleted { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }
}
創建它的代碼也簡單:
using (var context = _factory.CreateDbContext(null))
{
var term = new AcademicTermDate();
term.StartDate = new DateTime(2001, month, 1);
context.AcademicTermDate.Add(term);
context.SaveChanges();
}
有趣的是,如果我用舊的普通的SQL服務器按下面的代碼:
public MyContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<MyContext>();
var connectionString = "server=.\\sql2012;Database=CA15;Trusted_Connection=True;";
builder.UseSqlServer(connectionString);
return new MyContext(builder.Options);
}
它按預期工作; on context.SaveChanges()我可以看到RowVersion被填充。
但是,如果我使用InMemory數據庫提供程序,它似乎很適合我的測試,我可以看到一個不同的行爲:RowVersion仍然填充空值(即根本沒有初始化)。
對於後者,工廠被定義爲:
public MyContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<MyContext>();
builder.UseInMemoryDatabase(databaseName: "InMemory");
return new MyContext(builder.Options);
}
我失去了InMemory分貝我應該提供任何重要的設置?這種差異看起來很奇怪,而且說實話,這很令人不安。
所有代碼的目標.NET 2.0的核心:
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.ComponentModel.Annotations" Version="4.4.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
</ItemGroup>
任何幫助極大的讚賞。
您是否嘗試過流暢的api來設置併發令牌? –
是的,我確實: modelBuilder.Entity() \t \t .Property(p值=> p.RowVersion) \t \t .ValueGeneratedOnAddOrUpdate() \t \t .IsConcurrencyToken() \t \t; –
行,前面的代碼可能是不正確的,但是這一個不起作用既不:modelBuilder.Entity() \t \t .Property(p值=> p.RowVersion) \t \t .ValueGeneratedOnAddOrUpdate() .IsRowVersion () ; –