2016-05-23 12 views
8

Tôi đang cố gắng sử dụng di chuyển EF7 và bị kẹt khi tôi mô hình hóa mô hình Tổ chức có kế thừa.Chuyển đổi EF7 - Loại CLR tương ứng cho loại thực thể '' không phải là tức thời

Tổ chức là lớp trừu tượng và có hai lớp cụ thể kế thừa nó được gọi là Cá nhân và Công ty.

Tôi đặt lớp trừu tượng Tổ chức là DbSet trong DbContext và chạy di chuyển.

Tôi đang theo hướng dẫn này here

Các lỗi sau đây được hiển thị:

Loại CLR tương ứng cho loại hình tổ chức 'Tổ chức' không instantiable và không có loại thực thể có nguồn gốc trong mô hình đó tương ứng với loại CLR cụ thể.

Tôi nên làm gì?

EDIT - Cập nhật với mã

Tổ chức

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; } 

} 

cá nhân

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

Công ty

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); 
    } 
} 

Cảm ơn trước!

+0

hãy thêm mã trong câu hỏi. –

+0

Bạn có DbContext trong cùng một dự án hoặc trong một dự án riêng biệt? –

+0

@TomDroste DbContext nằm trong cùng một dự án thư viện lớp vì các mô hình miền và di chuyển nằm trong dự án web. – Rovdjuret

Trả lời

11

Xin xem: https://docs.microsoft.com/en-us/ef/core/modeling/inheritance

Nếu bạn không muốn để lộ một DbSet cho một hoặc nhiều thực thể trong hệ thống phân cấp, bạn có thể sử dụng API thông thạo để đảm bảo chúng được bao gồm trong mô hình.

Nếu bạn không muốn phải tạo một DbSet cho mỗi lớp con sau đó bạn phải xác định một cách rõ ràng chúng trong OnModelCreating override của 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); 
    } 
} 
+0

Đẹp, tôi sẽ thử điều đó! – Rovdjuret

+0

Tôi đã gặp sự cố này và câu trả lời của bạn đã giải quyết được sự cố của tôi. Vì đây là trường hợp sử dụng hợp lý nhất (tại sao thậm chí có một lớp cơ sở nếu bạn chỉ truy vấn cho các lớp con?) Tôi nghĩ câu trả lời này nên là câu trả lời được chấp nhận. – blagae

+0

Liên kết của bạn đã bị hỏng ngay bây giờ. –

0

Sự cố có thể là bạn sử dụng dự án class library. Trong RC2 của EF Core bạn không thể đặt DBContext của bạn trong một dự án như vậy. Đây là một vấn đề được biết đến. Khi bạn chuyển đổi nó thành dự án 'ứng dụng', nó sẽ hoạt động trở lại.

Thông tin thêm & nguồn:

Cách giải quyết: https://docs.efproject.net/en/latest/cli/dotnet.html#dotnet-cli-issues

Github vấn đề: https://github.com/aspnet/EntityFramework/issues/5460

+1

Đây không phải là trường hợp. Tôi đã có vấn đề này trong quá khứ và giải quyết nó như được viết trong các liên kết bạn đăng. Tôi đã sử dụng di chuyển thành công nhưng bây giờ khi tôi sử dụng thừa kế nó ném lỗi tôi đã cung cấp trước đó trong mô tả của tôi. Có vẻ như vấn đề là với TPT (Bảng cho mỗi loại) Xem liên kết: http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2- table-per-type-tpt – Rovdjuret

1

Tương tự như hướng dẫn bạn liên kết, DbSet<> tài sản của bạn nên là kế thừa IndividualCompany lớp.

Cố gắng có cái nhìn CoreDbContext của bạn nhiều như thế này:

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); 
    } 
} 
+3

Trong EF6, theo điều này: http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-inheritance-with -the-entity-framework-in-an-asp-net-mvc-application Bạn có thể định nghĩa DbSet bằng cách sử dụng lớp cơ sở. Làm điều tương tự trong EF Core dường như không hoạt động. – jcmcbeth

Các vấn đề liên quan