Entity Frameworkコアにエンティティのグラフを追加する

.net c# entity-framework entity-framework-core

質問

私はEF Core 1.1.0のコードファーストアプローチを使用して、自分のエンティティをSQLデータベースに作成しました。

私のエンティティの一部は、他のエンティティ(1対1または一対多)へのナビゲーションプロパティを持っています。

つまり、ナビゲーションプロパティを持つエンティティを追加しようとすると、ルートエンティティは正常に追加されますが、関連するエンティティは追加されません。

以下は、以下のコードです:

public class PopcornContext : DbContext
{
    public PopcornContext(DbContextOptions<PopcornContext> options)
        : base(options)
    {
    }

    public virtual DbSet<Movie> MovieSet { get; set; }
}

public partial class Movie
{
    public Movie()
    {
        this.Genres = new HashSet<Genre>();
        this.Cast = new HashSet<Cast>();
    }

    public int Id { get; set; }
    public string Url { get; set; }
    public string ImdbCode { get; set; }
    public string Title { get; set; }
    public string TitleLong { get; set; }
    public string Slug { get; set; }
    public int Year { get; set; }

    public virtual ICollection<Genre> Genres { get; set; }
    public virtual ICollection<Cast> Cast { get; set; }
}

public class PopcornContextFactory : IDbContextFactory<PopcornContext>
{
    public PopcornContext Create(DbContextFactoryOptions options)
    {
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json");
        var configuration = builder.Build();

        var optionsBuilder = new DbContextOptionsBuilder<PopcornContext>();
        optionsBuilder.UseSqlServer(configuration["SQL:ConnectionString"]);

        return new PopcornContext(optionsBuilder.Options);
    }
}

次のような映画を挿入すると:

using (var context = new PopcornContextFactory().Create(new DbContextFactoryOptions()))
{
    var movie = new Database.Movie
    {
        ImdbCode = movieJson.ImdbCode,
        TitleLong = movieJson.TitleLong,
        Year = movieJson.Year,
        Cast = movieJson.Cast.Select(cast => new Database.Cast
        {
            ImdbCode = cast?.ImdbCode,
            SmallImage = cast?.SmallImage,
            CharacterName = cast?.CharacterName,
            Name = cast?.Name
        }).ToList(),
        Genres = movieJson.Genres.Select(genre => new Database.Genre
        {
            Name = genre
        }).ToList(),
        Slug = movieJson.Slug,
        Title = movieJson.Title,
        Url = movieJson.Url
    };

    await context.MovieSet.AddAsync(movie);
    await context.SaveChangesAsync();
}

ムービーはすべてのフィールドでデータベースに追加されますが、GenresとCastはそこにはありません(ヌル値)。

私は以下のようにコード一進のアプローチを設定しました:

Add-Migration Initial

Update-Database

私は何を取りこぼしたか?私はこのコードがEF6でも使えると確信しています。

受け入れられた回答

私はそれを理解した。実際には、EFコアにAddAsyncメソッドがある既知のバグです。非同期以外のAddメソッドは期待通りに機能します。

ここをクリック



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ