0

是否有可能使用通用支持單表繼承,並仍然能夠查找所有的基類?使用STI和ActiveRecordBase <>與全FindAll

作爲一個獎勵問題,我是否也可以使用ActiveRecordLinqBase <>?我很喜歡這些問題。

更多細節: 說我有以下類定義:

public interface ICompany 
{ 
    int ID { get; set; } 
    string Name { get; set; } 
} 

[ActiveRecord("companies", 
    DiscriminatorColumn="type", 
    DiscriminatorType="String", 
    DiscriminatorValue="NA")] 
public abstract class Company<T> : ActiveRecordBase<T>, ICompany 
{ 
    [PrimaryKey] 
    private int Id { get; set; } 

    [Property] 
    public String Name { get; set; } 
} 

[ActiveRecord(DiscriminatorValue="firm")] 
public class Firm : Company<Firm> 
{ 
    [Property] 
    public string Description { get; set; } 
} 

[ActiveRecord(DiscriminatorValue="client")] 
public class Client : Company<Client> 
{ 
    [Property] 
    public int ChargeRate { get; set; } 
} 

也能正常工作在大多數情況下。我可以做這樣的事情:

var x = Client.FindAll(); 

但有時我希望所有的公司。如果我沒有使用泛型我可以這樣做:

var x = (Company[]) FindAll(Company); 
Client a = (Client)x[0]; 
Firm b = (Firm)x[1]; 

有沒有寫一個返回ICompany的數組,然後可以強制轉換成他們各自的類型中的FindAll的方法嗎?
喜歡的東西:

var x = (ICompany[]) FindAll(Company<ICompany>); 
Client a = (Client)x[0]; 

或者,也許我會有關實現通用的支持都錯了?

回答

0

如何:

[ActiveRecord("companies", 
    DiscriminatorColumn="type", 
    DiscriminatorType="String", 
    DiscriminatorValue="NA")] 
public abstract class Company : ActiveRecordBase<Company>, ICompany { 
    [PrimaryKey] 
    private virtual int Id { get; set; } 

    [Property] 
    public virtual String Name { get; set; } 
} 

[ActiveRecord(DiscriminatorValue="firm")] 
public class Firm : Company { 
    [Property] 
    public virtual string Description { get; set; } 
} 

[ActiveRecord(DiscriminatorValue="client")] 
public class Client : Company { 
    [Property] 
    public virtual int ChargeRate { get; set; } 
} 

var allClients = ActiveRecordMediator<Client>.FindAll(); 
var allCompanies = ActiveRecordMediator<Company>.FindAll(); // Gets all Companies (Firms and Clients). Same as Company.FindAll(); 

請注意,你不能只是垂頭喪氣的公司作爲客戶端或企業,你需要使用適當的多態性或訪客。有關說明,請參閱this

+0

我寧願避免需要所有我的子類中介。我只需要在場合找到所有公司。我會一直使用公司和客戶的通用功能。 而且,我正在使用downcast來顯示數組包含客戶端的升級形式。它不僅包含公司的。我有可能不會假定無序數組中的第一個對象也是一個Client。 – oillio 2010-05-05 21:51:42

+0

如果您希望能夠執行'Client.FindAll()',您必須在客戶端實現靜態方法,使用'ActiveRecordMediator ' – 2010-05-05 22:44:06

相關問題