NHIbernate: Получить дочерний объект, отфильтрованный по свойству родительского объекта - PullRequest
0 голосов
/ 02 июня 2018

Я использую Fluent NHibernate для сопоставления своих сущностей.

Мои классы:

public class Email
{
    public virtual int Id           { get; protected set; }
    public virtual string Status    { get; set; }
    public virtual string Login     { get; set; }
    public virtual string Password  { get; set; }
    public virtual Profile Profile  { get; set; }
    public virtual DateTime Created { get; set; }
}

public class Profile
{
    public virtual int Id             { get; protected set; }
    public virtual string ProfilePath { get; set; }
    public virtual Proxy Proxy        { get; set; }
    public virtual DateTime Created   { get; set; }
}

public class Proxy
{
    public virtual int Id           { get; protected set; }
    public virtual string Status    { get; set; }
    public virtual string Ip        { get; set; }
    public virtual string Port      { get; set; }
    public virtual string Type      { get; set; }
    public virtual DateTime Created { get; set; }
}

EntityMaps:

public class EmailMap : ClassMap<Email>
{
    public EmailMap()
    {
        Id(c => c.Id);
        Map(c => c.Status).Not.Nullable();
        Map(c => c.Login).Not.Nullable();
        Map(c => c.Password).Not.Nullable();
        Map(c => c.Created).Not.Nullable();
        References(c => c.Profile).Cascade.All();
    }
}

public class ProfileMap : ClassMap<Profile>
{
    public ProfileMap()
    {
        Id(c => c.Id);
        Map(c => c.ProfilePath).Not.Nullable();
        Map(c => c.Created).Not.Nullable();
        References(c => c.Proxy).Cascade.All();
    }
}

public class ProxyMap : ClassMap<Proxy>
{
    public ProxyMap()
    {
        Id(c => c.Id);
        Map(c => c.Status).Not.Nullable();
        Map(c => c.Ip).Not.Nullable();
        Map(c => c.Port).Not.Nullable();
        Map(c => c.Type).Not.Nullable();
        Map(c => c.Created).Not.Nullable();
    }
}

Каждое письмо имеет только один профиль.Каждый профиль имеет только один прокси.Я хочу, чтобы прокси-класс был независимым (я имею в виду, что я не хочу изменять его или адаптировать для другого проекта), и поэтому я не хочу отображать в родительские объекты, такие как Profile, Email.Потому что эти коллекции родительского объекта могут быть бесполезны в другом проекте.Вот почему я установил отношения в одну сторону (пожалуйста, поправьте меня, если я ошибаюсь или неправильно понимаю).Поэтому я не могу получить электронную почту от дочернего профиля (то же самое с профилем и прокси).

Теперь я пытаюсь написать метод, используя QueryOver, который возвращает прокси, которые не использовались с «пользовательского интервала» (входные данные).Так что в случае электронной почты, я должен получить все электронные письма, которые были созданы после «ввода», получить их профиль, получить их прокси.И на последнем шаге обратный отбор.Поэтому я получаю прокси, которые не использовались в почтовом проекте в течение определенного промежутка времени.Я понял это, используя ISQLQuery:

SELECT *
FROM proxy
WHERE proxy.Id
NOT IN
(
    SELECT profile.Proxy_id
    JOIN profile ON email.Profile_id = profile.id
    WHERE email.Created > NOW() - INTERVAL 1 DAY
);

Я не уверен насчет «одностороннего» отношения.

Я думаю, что это делает сущность универсальной.Я имею в виду, что это может быть полезно для многих других проектов.Я не хочу добавлять родительскую коллекцию (Profile) для child (Proxy) каждый раз, когда создаю новый проект.Например, мне нужно получить прокси для других классов (не для электронной почты).И я использую тот же метод из моего ProxyRepository.

Входные параметры Ofcourse будут содержать данные о родительской сущности (поскольку родительская сущность содержит свойство).

Извините, для моего английского.

1 Ответ

0 голосов
/ 15 июня 2018

а как же

var proxies = session.QueryOver<Email>.Where(email => email.Created < DateTime.Now() - TimeSpan.FromDays(1)).Select(email => email.Profile.Proxy);
...