开发者

using STI and ActiveRecordBase<> with full FindAll

开发者 https://www.devze.com 2022-12-29 13:13 出处:网络
Is it possible to use generic support with single table inheritance, and still be able to FindAll of the base class?

Is it possible to use generic support with single table inheritance, and still be able to FindAll of the base class?

As a bonus question, will I be able to use ActiveRecord开发者_如何转开发LinqBase<> as well? I do love those queries.

More detail: Say I have the following classes defined:

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

This works fine for most cases. I can do things like:

var x = Client.FindAll();

But sometimes I want all of the companies. If I was not using generics I could do:

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

Is there a way to write a FindAll that returns an array of ICompany's that can then be typecast into their respective types?

Something like:

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

Or maybe I am going about implementing the generic support all wrong?


How about this:

[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();

Note that you can't just downcast your Companies as Clients or Firms, you need to use proper polymorphism or a visitor. See this for an explanation.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号