【发布时间】:2019-08-26 20:11:00
【问题描述】:
我尝试使用 EF 核心,但我的模型只有一部分保存到数据库中。
这是我的模型:
public class EngineType
{
public string Name { get; set; }
}
public class Car
{
public long CarId { get; set; }
public string Name { get; set; }
public EngineType Engine { get; set; }
}
保存 CarId 和名称,但不保存 EngineType。
这是我使用的测试,但actual.Engine 始终为空:
[TestMethod]
public void WhenIAddAndSaveANewCarThenItIsAddedToDB()
{
using var target = new EFCoreExampleContext();
using var concurrentContext = new EFCoreExampleContext();
var expected = new Car() {CarId = 0815, Name = "Isetta", Engine = new EngineType() { Name = "2Takt" }};
target.Cars.Add(expected);
target.SaveChanges();
var actual = concurrentContext.Cars.Single();
Assert.AreEqual(1, concurrentContext.Cars.Count());
Assert.IsNotNull(actual.Engine);
Assert.AreEqual(expected, actual);
}
我的上下文如下所示:
public class EFCoreExampleContext : DbContext
{
public DbSet<Car> Cars { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseInMemoryDatabase(databaseName: "Add_writes_to_database");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<EngineType>(
d =>
{
d.HasKey(e => e.Name);
d.Property(e => e.Name).IsRequired();
});
modelBuilder.Entity<EngineType>(
d =>
{
d.HasKey(e => e.Name);
});
modelBuilder.Entity<Car>(
d =>
{
d.HasKey(e => e.CarId);
d.Property<DateTime>("LastChanged").IsRowVersion().ValueGeneratedOnAddOrUpdate();
d.Property<string>("EngineForeignKey");
d.HasOne(e => e.Engine)
.WithMany()
.HasForeignKey("EngineForeignKey")
.IsRequired();
});
}
}
知道我做错了什么(或者哪个现有主题回答了这个问题 - 我什至没有正确的搜索词来找到它)。
谢谢!
【问题讨论】:
-
Cars.Single()?是什么让你认为这会拉到正确的车?试试var actual = concurrentContext.Cars.Where(x => x.Id == expexted.Id).Single(); -
因为数据库中只有一辆车...感谢查看代码@mxmissile!
-
你在哪里擦除数据库?测试方法应该设计成可以反复运行很多次。
-
嗨@mxmissile,我不需要擦除数据库,因为它是一个内存数据库(用于测试),并且测试中有一个断言恰好存储了一个项目。
标签: entity-framework-core ef-core-2.2