EF Core:只有部分模型保存到数据库

EF Core: Only part of the model is saved to the database

我尝试使用 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 和名称已保存,但未保存引擎类型。

这是我使用的测试,但 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();
           });
    }
}

知道我做错了什么(或者哪个现有主题回答了这个问题——我什至没有正确的搜索词来找到它)。

谢谢!

我觉得储蓄没有问题。 Entity Framework 默认不进行预先加载。所以你必须显式地包含任何应该在结果中的导航属性。在获取实际数据时试试这个,

using Microsoft.EntityFrameworkCore;

var actual = concurrentContext.Cars.Include(c => c.Engine).Single();