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

时间:2019-08-22 13:41:39

标签: entity-framework-core ef-core-2.2

我尝试使用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();
           });
    }
}

任何想法我在做什么错(或者哪个现有主题回答了这个问题-我什至没有正确的搜索词来找到它)。

谢谢!

1 个答案:

答案 0 :(得分:3)

我认为保存没有问题。实体框架默认情况下不急于加载。因此,您必须明确包括应该包含的所有导航属性。在获取实际值时,请尝试此操作

using Microsoft.EntityFrameworkCore;

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