2012-03-27 37 views
9

Tôi có một đối tượng cơ sở mà tôi không muốn được ánh xạ trong DB như một thực thể, tôi chỉ muốn các tính chất được bổ sung vào đối tượng đó được ánh xạ trong DB:Inheritance EF Code-First

Không ánh xạ đối tượng (không biết nếu nó quan trọng nhưng baseobject là trong lắp ráp khác):

public class BaseObject 
{ 
    public virtual string Prop1 { get; set; } 
    public virtual string Prop2 { get; set; } 
} 

đối tượng đã ánh xạ:

public class ChildObject : BaseObject 
{ 
    public virtual string Prop3 { get; set; } 
    public virtual string Prop4 { get; set; } 
    public virtual string Prop5 { get; set; } 
} 

gì được đăng ký tại DbContext

public DbSet<ChildObject> ChildObjects { get; set; } 

gì tôi muốn nhìn thấy trong Db

table:ChildObject 
    col:Prop1 (from BaseObject) 
    col:Prop2 (from BaseObject) 
    col:Prop3 
    col:Prop4 
    col:Prop5 

Để tiếp tục, những gì tôi muốn làm, là phải có một bảng trong Db mà có trẻ em và các thuộc tính cơ bản.

Đây là lỗi tôi hiện đang nhận được:

Loại 'namespace.ChildObject' không được ánh xạ. Kiểm tra xem loại chưa được loại trừ một cách rõ ràng bằng cách sử dụng phương thức Bỏ qua hoặc Chú thích dữ liệu NotMappedAttribute. Xác minh rằng loại đã được xác định là một lớp, không phải là nguyên thủy, lồng nhau hoặc chung chung và không kế thừa từ EntityObject.

Tôi đã tìm hiểu, nhưng không thể tìm thấy cách thực hiện việc này.

Bất kỳ ý tưởng nào?

EDIT:

@ Kyle Trauberman là đúng, tuy nhiên, đối với một số lý do có vẻ là một vấn đề với kế thừa từ một lớp cơ sở trong lắp ráp khác nhau. Tôi chỉ đơn giản là làm điều này.

class BaseObjectClone : BaseObject { } /* BaseObject being in another assembly */ 

public class ChildObject : BaseObjectClone { 
    public virtual string Prop3 { get; set; } 
    public virtual string Prop4 { get; set; } 
    public virtual string Prop5 { get; set; } 
} 
+2

Vì vậy, bạn không muốn các thuộc tính được xác định trong lớp cơ sở được ánh xạ tới cơ sở dữ liệu? Hay bạn muốn họ ánh xạ? Bạn đang thấy gì bây giờ, so với những gì bạn muốn xem? –

+0

xin lỗi có thể không rõ ràng. Tôi có nghĩa là tôi không muốn baseobject được ánh xạ như là một thực thể khác nhau nhưng tôi muốn các tài sản để hiển thị trong đối tượng con. –

+0

Tôi đã có thể giải quyết trường hợp tương tự của mình với câu trả lời của tôi [ở đây] (https://stackoverflow.com/a/45762308/1718832) – vk5880

Trả lời

10

Morteza Manavi có một bài đăng blog chi tiết làm thế nào để làm điều này:

http://weblogs.asp.net/manavi/archive/2011/01/03/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines.aspx

Về cơ bản, bạn sẽ cần phải ghi đè OnModelCreating trong DbContext của bạn và gọi MapInheritedProperties() cho mỗi bảng con.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<BankAccount>().Map(m => 
    { 
     m.MapInheritedProperties(); 
     m.ToTable("BankAccounts"); 
    }); 

    modelBuilder.Entity<CreditCard>().Map(m => 
    { 
     m.MapInheritedProperties(); 
     m.ToTable("CreditCards"); 
    });    
} 
+0

Morteza có toàn bộ chuỗi bài đăng về thừa kế mà bạn nên kiểm tra. Đây là phần 1: http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per- hệ thống phân cấp-tph.aspx –

+0

Tôi đã đi qua bài viết này, nhưng có lẽ tôi đang thiếu một cái gì đó bởi vì nó vẫn còn ném một lỗi trên 'ChildObject' –

+1

Nó sẽ rất hữu ích để biết những gì bạn đang nhận được lỗi. –

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