EF7移行を使用しようとしていますが、継承を使用してOrganization
モデルをモデル化したときにスタックしました。
Organization
は抽象クラスです。 Individual
とCompany
と呼ばれる2つの具象クラスがあります。
Organization
抽象クラスをDbContext
のDbSet<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);
}
}
前もって感謝します!
参照してください: https://docs.Microsoft.com/en-us/ef/core/modeling/inheritance
階層内の1つ以上のエンティティのDbSetを公開したくない場合は、Fluent APIを使用して、それらがモデルに含まれていることを確認できます。
サブクラスごとにDbSet
を作成する必要がない場合は、OnModelCreating
の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)
{
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);
}
}
リンクしたチュートリアルと同様に、DbSet<>
プロパティは、継承するIndividual
およびCompany
classesである必要があります。
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);
}
}
問題は、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