首页 > 解决方案 > 与 ID 未知的对象相关的种子数据

问题描述

我在将数据播种到 EF Core DB 时遇到问题。数据由具有Person对象作为其导演的关系的电影组成。这种关系的基础是一部电影应该有一个导演,并且数据库中的每个导演实体都有一部导演的电影(不理想,但除此之外)。当我尝试在数据库中播种初始数据时,就会出现问题。由于我正在播种电影和导演,因此我无法事先知道实体的 ID,并且我需要能够在创建与其相关的电影之前搜索具有给定名称的导演的上下文.

例如:

这是人民(导演)的播种

public void Configure(EntityTypeBuilder<Person> builder)
{
    builder.ToTable("Persons");
    builder.Property(p => p.Id).HasColumnName("Id");
    builder.HasData(
        new Person
        {
            Id = Guid.NewGuid().ToString(),
            Name = "Ridley Scott"
        }
    );
}

这是电影的种子

public void Configure(EntityTypeBuilder<Movie> builder)
{
    using AtlasDbContext context = new AtlasDbContext();
    Person director = context.Persons.FirstOrDefault(p => p.Id.Equals("Ridley Scott"));
    builder.ToTable("Movies");
    builder.Property(m => m.Id).HasColumnName("Id");
    builder.HasData(
        new Movie
        {
            Title = "The Martian",
            Poster = File.ReadAllBytes($"{Environment.CurrentDirectory}\\wwwroot\\img\\TheMartian.poster.jpg"),
            Cover = File.ReadAllBytes($"{Environment.CurrentDirectory}\\wwwroot\\img\\TheMartian.cover.jpg"),
            ReleaseYear = "2015",
            SubTitle = "Bring Him Home",
            UserScore = 77,
            Overview = "During a manned mission to Mars," +
                       "Astronaut Mark Watney is presumed dead after a fierce storm and left behind by his crew. " +
                       "But Watney has survived and finds himself stranded and alone on the hostile planet. " +
                       "With only meager supplies, he must draw upon his ingenuity, " +
                       "wit and spirit to subsist and find a way to signal to Earth that he is alive.",
            DirectorId = director?.Id,
            Budget = 108000000,
            Revenue = 630161890,
            Genres = new List<Genre>
            {
                Genre.Adventure,
                Genre.Drama,
                Genre.ScienceFiction
            }
        }
    );
}

数据库上下文是在没有依赖注入的情况下实例化的,因为我无法在重写的方法中对上下文进行 DI。但是,当我尝试为此种子创建迁移时,迁移会成功构建,但不会创建任何内容,并且终端无法输入(卡在“构建成功”上),这让我相信无限循环是由此代码创建。

如何在 EF Core 中播种这种类型的数据?

标签: c#asp.net-coreentity-framework-core

解决方案


我通常不建议每次都创建新的 GUID。此代码在部署到不同的环境(即登台和生产环境)时会生成不同的 ID,因此您只需按名称查询对象,创建 ID 列似乎没用。此外,您还需要为每个实体定义主键。所以如果你硬编码你的GUID会更好

var personId="17FD2873-FF9D-4951-9346-1C71BD0AC0DE";
new Person
    {
        Id = personId,
        Name = "Ridley Scott"
    }

推荐阅读