web-dev-qa-db-ja.com

EF7の移行-エンティティタイプ ''に対応するCLRタイプはインスタンス化できません

EF7移行を使用しようとしていますが、継承を使用してOrganizationモデルをモデル化したときにスタックしました。

Organizationは抽象クラスです。 IndividualCompanyと呼ばれる2つの具象クラスがあります。

Organization抽象クラスをDbContextDbSet<Organization>として設定し、移行を実行します。

私はこのチュートリアルに従っています ここ

次のエラーが表示されます。

エンティティタイプ 'Organization'に対応するCLRタイプはインスタンス化できず、具体的なCLRタイプに対応する派生エンティティタイプはモデルにありません。

どうすればいいですか?

編集-コードで更新されました。

組織:

public abstract class Organization
{
    public Organization()
    {
        ChildOrganizations = new HashSet<Organization>();
    }

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public bool Enabled { get; set; }
    public bool PaymentNode { get; set; }
    public DateTime Created { get; set; }
    public DateTime Updated { get; set; }

    // virtual
    public virtual ICollection<Organization> ChildOrganizations { get; set; }
}

個人

public class Individual : Organization
{
    public string SocialSecurityNumber { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

会社

public class Company : Organization
{
    public string Name { get; set; }
    public string OrganizationNumber { get; set; }
}

DbContext

public class CoreDbContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<Organization> Organization { get; set; }

    public CoreDbContext(DbContextOptions<CoreDbContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        // Customize the ASP.NET Identity model and override the defaults if needed.
        // For example, you can rename the ASP.NET Identity table names and more.
        // Add your customizations after calling base.OnModelCreating(builder);
    }
}

前もって感謝します!

10
Rovdjuret

参照してください: https://docs.Microsoft.com/en-us/ef/core/modeling/inheritance

階層内の1つ以上のエンティティのDbSetを公開したくない場合は、Fluent APIを使用して、それらがモデルに含まれていることを確認できます。

サブクラスごとにDbSetを作成する必要がない場合は、OnModelCreatingDbContextオーバーライドで明示的に定義する必要があります。

public class CoreDbContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<Organization> Organization { get; set; }

    public CoreDbContext(DbContextOptions<CoreDbContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Individual>();
        builder.Entity<Company>();

        base.OnModelCreating(builder);
        // Customize the ASP.NET Identity model and override the defaults if needed.
        // For example, you can rename the ASP.NET Identity table names and more.
        // Add your customizations after calling base.OnModelCreating(builder);
    }
}
20
Joel McBeth

リンクしたチュートリアルと同様に、DbSet<>プロパティは、継承するIndividualおよびCompanyclassesである必要があります。

CoreDbContextを次のように見せてみてください。

public class CoreDbContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<Company> Companies { get; set; }
    public DbSet<Individual> Individuals { get; set; }

    public CoreDbContext(DbContextOptions<CoreDbContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        // Customize the ASP.NET Identity model and override the defaults if needed.
        // For example, you can rename the ASP.NET Identity table names and more.
        // Add your customizations after calling base.OnModelCreating(builder);
    }
}
1
Nick Cromwell

問題は、class libraryプロジェクトを使用していることである可能性があります。 EF CoreのRC2では、このようなプロジェクトにDBContextを配置することはできません。これは既知の問題です。 'app'プロジェクトに変換すると、再び機能するはずです。

詳細とソース:

回避策: https://docs.efproject.net/en/latest/cli/dotnet.html#dotnet-cli-issues

Githubの問題: https://github.com/aspnet/EntityFramework/issues/546

0
Tom Droste