7

私の ASP.NET Core 1.0、MVC6、EF7 Web アプリケーションでは、新しい関連テーブル (および対応するモデル) を追加する移行を追加しています。次のモデルのスナップショットがあります。

[DbContext(typeof(ApplicationDbContext))]
partial class ApplicationDbContextModelSnapshot : ModelSnapshot
{
    protected override void BuildModel(ModelBuilder modelBuilder)
    {
        modelBuilder
            .HasAnnotation("ProductVersion", "7.0.0-rc1-16348")
            .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

        modelBuilder.Entity("Salesboost.Models.ApplicationUser", b =>
        {
            b.Property<string>("Id");
            b.Property<int?>("TeamId");
            b.HasKey("Id");
            // -- <unrelated fields snipped> --
        });

        // -- <snipped> --

        modelBuilder.Entity("Team", b =>
        {
            b.Property<int>("Id").ValueGeneratedOnAdd();
            b.Property<string>("Name").IsRequired();
            b.Property<string>("ManagerId").IsRequired();
            b.HasKey("Id");
        });

        modelBuilder.Entity("Team", b =>
        {
            b.HasOne("ApplicationUser", "Manager")
                .WithOne("TeamManaging")
                .HasForeignKey("ManagerId");
        });
    }
}

Team.cs:

public class Team
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string ManagerId { get; set; }

    public virtual ApplicationUser Manager { get; set; }
    public virtual ICollection<ApplicationUser> Members { get; set; }
}

アプリケーション ユーザー:

public class ApplicationUser : Microsoft.AspNet.Identity.EntityFramework.IdentityUser
{
    public int? TeamId { get; set; }

    public virtual Team Team { get; set; }
    public virtual Team TeamManaging { get; set; }
}

データベースを更新しようとすると、dnx で次のエラーが表示されます。

エンティティ タイプがシャドウ状態で定義されており、ナビゲーション プロパティをシャドウ状態に追加できないため、ナビゲーション プロパティ 'マネージャー' をエンティティ タイプ 'チーム' に追加できません。

エンティティ タイプが「シャドウ状態」にあるとはどういう意味ですか? これを回避する方法はありますか?

4

4 に答える 4

1

EFのドキュメントでは、シャドウ プロパティとは何かについて説明しています。

Fluent API を使用して、シャドウ プロパティを構成できます。Property - AC の文字列オーバーロードを呼び出したら、他のプロパティに対して行う任意の構成呼び出しを連鎖させることができます。

Property メソッドに指定されProperty<...>("...")た名前 ( - AC) が既存のプロパティの名前 - AC (シャドウ プロパティまたはエンティティ クラスで定義されたプロパティ) と一致する場合、コードは新しいシャドウ プロパティを導入するのではなく、その既存のプロパティを構成します。

したがって、エンティティが少なくとも 1 つのシャドウ プロパティを持っている場合、エンティティはシャドウ状態にあると思います。

これは、 の文字列オーバーロードを使用する場合は非常に注意する必要があることを意味します。これは、Property<...>("...")必要がない場合でもシャドウ プロパティが導入される可能性があるためです。その結果、データベースを作成する必要がある場合、EF は、シャドウ状態のエンティティの CLR 型が存在しないと不平を言います。

nameof()プレーン文字列の代わりに使用すると役立つ場合があります。Property<...>(nameof(...))したがって、過負荷はどちらが安全かのように見えます。

そして最後に、ポイントに近づくために、エンティティ間の関係を処理するためにシャドウ プロパティが導入されます。次のように説明します。

慣例により、シャドウ プロパティはリレーションシップが検出されたときにのみ作成されますが、依存エンティティ クラスで外部キー プロパティが検出されません。この場合、シャドウ外部キー プロパティが導入されます。

于 2016-10-25T08:51:24.163 に答える
0

問題は実際に私のApplicationDbContextクラスに関連していました。移行を手動で作成して を更新する代わりにApplicationDbContextModelSnapshot、以下を追加しましたApplicationDbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    // -- <snipped> --
    public DbSet<Team> Teams { get; set; }
    public ApplicationUser Manager { get; set; }
    public ApplicationUser Members { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<Team>().HasOne(typeof(ApplicationUser), "Manager")
            .WithOne("TeamManaging")
            .HasForeignKey(typeof(Team), "ManagerId")
            .HasPrincipalKey(typeof(ApplicationUser), "Id");
        builder.Entity<ApplicationUser>().HasOne(typeof(Team), "Team")
            .WithMany("Members")
            .HasForeignKey("TeamId");
    }
}

次に、を使用してマイグレーションを生成する方法を学びましdnx ef migrations add [migration name]た。

このようにして、私は自分のサイトを正常に機能させましたが、誰かが答えることができれば、「影の状態」とは何かを知りたいです.

于 2016-01-29T18:38:33.790 に答える