2017-09-18 28 views
0

我有一個類Log有一個屬性Entity。此實體將作爲共享基類的App內的其他對象(Customer,Supplier,InvoiceCredit)的引用。導航屬性,取決於現有財產

public class Log 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 
    public LogCode Code { get; set; }  
    public string Message { get; set; } 
    public string StackTrace { get; set; } 
    public string SourceID { get; set; } 
    public DateTime DateCreated { get; internal set; } 
    public bool Acknowledged { get; set; } 
    public EntityType EntityType { get; set; }  
    public BaseModel Entity { get; set; } 
} 

EntityType屬性包含enum,我可以用它來確定實體的類型。

public enum EntityType 
{ 
    Customer, 
    Supplier, 
    Invoice, 
    Credit, 
} 

在數據庫中的表存儲該實體的ID但是作爲每個實體類型被存儲在不同的表我有困難收集此實體。

我試着修改了設置器EntityType來收集正確的實體,但Log沒有任何提及DbContext

沒有EF我會打開實體類型並使用不同的服務對象加載正確的實體,但有沒有辦法讓我可以設置實體框架來使用EntityType來收集正確的Entity

回答

0

我認爲你應該實施表每個混凝土類型(TPC)的方法。唯一的限制:您必須使用Guid類型的Id而不是int,或者保留int,但在這種情況下,您應該手動爲其分配值。

public abstract class BaseModel 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id {get;set;} 
    public string SomeCommonProperty {get;set;} 
}  

public class Log 
{ 
    //other properties... 
    //EntityType is not needed, but you can leave it  
    public EntityType EntityType { get; set; } 
    public virtual BaseModel Entity { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public DbSet<BaseModel> Entities { get; set; } 
    public DbSet<Log> Logs { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Customer>().Map(m => 
     { 
      m.MapInheritedProperties(); 
      m.ToTable("Customers"); 
     });  
     modelBuilder.Entity<Supplier>().Map(m => 
     { 
      m.MapInheritedProperties(); 
      m.ToTable("Suppliers"); 
     });    
    } 
} 

使用

var suppliers = ctx.Entities.OfType<Supplier>() 
     .Where(x => x.SupplierProperty == "1").ToList(); 

var supplier = (log.Entity as Supplier); 
var customer = (log2.Entity as Customer); 
+0

不幸的是,我們的系統不是一個創建這些實體,我不能更改ID。我會將此標記爲答案,因爲我相信在大多數情況下,這將起作用 – Blinx