использование STI и ActiveRecordBase <> с полным FindAll - PullRequest
0 голосов
/ 05 мая 2010

Можно ли использовать универсальную поддержку с наследованием одной таблицы и при этом иметь возможность 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];

Есть ли способ написать FindAll, который возвращает массив ICompany, которые затем могут быть преобразованы по типу в их соответствующие типы?
Что-то вроде:

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

Или, может быть, я собираюсь реализовать общую поддержку неправильно?

1 Ответ

0 голосов
/ 05 мая 2010

Как насчет этого:

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

Обратите внимание, что вы не можете просто понизить рейтинг своих компаний как клиентов или фирм, вам нужно использовать правильный полиморфизм или посетителя. См. это для объяснения.

...