【问题标题】:EF Core: Only part of the model is saved to the databaseEF Core:只有部分模型保存到数据库
【发布时间】: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 =&gt; x.Id == expexted.Id).Single();
  • 因为数据库中只有一辆车...感谢查看代码@mxmissile!
  • 你在哪里擦除数据库?测试方法应该设计成可以反复运行很多次。
  • 嗨@mxmissile,我不需要擦除数据库,因为它是一个内存数据库(用于测试),并且测试中有一个断言恰好存储了一个项目。

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


【解决方案1】:

我认为保存没有问题。 Entity Framework 默认情况下不进行预加载。因此,您必须明确包含任何应该在结果中的导航属性。在获取实际数据时尝试此操作,

using Microsoft.EntityFrameworkCore;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多