Несколько взаимосвязей один-к-одному к одной таблице

Каков наилучший способ для моделирования нескольких отношений один-к-одному к одной таблице (sqlite-net-extensions)? Я ищу решение как это:

Class WayBill 
{
    [PrimaryKey, AutoIncrement]
    public int Id {get; set;} 

    [ForeignKey(typeof(Organization ))]
    public int ConsignerId {get; set;}

    [OneToOne]
    public Organization Consigner {get; set;}  

    [ForeignKey(typeof(Organization ))]
    public int ConsigneeId {get; set;}

    [OneToOne]
    public Organization Consignee {get; set;} 
}


Class Organization 
{
    [PrimaryKey, AutoIncrement]
    public int Id {get; set;} 

    public string Name {get; set;}
}    

Очевидно, что вышесказанное не сработает.

Я рассмотрел и другие варианты:

  1. создайте таблицу (WayBillOrganization), которая фиксирует роль организации: накладная ->> WayBillOrganization -> организация

  2. поместите необходимые обратные свойства OneToMany в организацию.

  3. Обрабатывать вещи вручную (т.е. хранить только первичные ключи в классе WayBill и загружать Организации отдельно).

Вариант 2. это то, чего я хочу избежать. Организации связаны со многими другими классами (не в моем примере), и даже в случае накладной есть еще несколько отношений, которые я не включил в пример (перевозчик, плательщик груза, экспедитор и т. Д.). Кроме того, я бы предпочел использовать обратные свойства только тогда, когда мне нужно ориентироваться (например, я не использую организацию для поиска накладных, поэтому обратное свойство - только дополнительная нагрузка).

Вариант 3. тоже не очень привлекателен.

Таким образом, вариант 1. кажется, путь. Но прежде чем отправиться туда, я хотел бы знать, действительно ли идеальное решение в моем примере действительно невозможно.

Итак, мой вопрос: есть ли способ моделировать множественные однонаправленные отношения OneToOne без явно объявленных обратных свойств?

1 ответ

Ваш вариант использования поддерживается в расширениях SQLite-Net. Вам нужно только явно указать внешние ключи в атрибутах отношений, потому что автоматическое обнаружение может работать не так, как ожидалось:

class WayBill 
{
    [PrimaryKey, AutoIncrement]
    public int Id {get; set;} 

    public int ConsignerId {get; set;}

    [OneToOne("ConsignerId")]
    public Organization Consigner {get; set;}  

    public int ConsigneeId {get; set;}

    [OneToOne("ConsigneeId")]
    public Organization Consignee {get; set;} 
}


class Organization 
{
    [PrimaryKey, AutoIncrement]
    public int Id {get; set;} 

    public string Name {get; set;}
}

Обратные отношения с тем же классом также поддерживаются, но также должны быть объявлены явно на обоих концах:

class WayBill 
{
    [PrimaryKey, AutoIncrement]
    public int Id {get; set;} 

    public int ConsignerId {get; set;}

    [OneToOne(foreignKey: "ConsignerId", inverseProperty: "ConsignerInverse")]
    public Organization Consigner {get; set;}  

    public int ConsigneeId {get; set;}

    [OneToOne(foreignKey: "ConsigneeId", inverseProperty: "ConsigneeInverse")]
    public Organization Consignee {get; set;} 
}


class Organization 
{
    [PrimaryKey, AutoIncrement]
    public int Id {get; set;} 

    public string Name {get; set;}

    [OneToOne(foreignKey: "ConsigneeId", inverseProperty: "Consignee")]
    public WayBill ConsigneeInverse { get; set; }

    [OneToOne(foreignKey: "ConsignerId", inverseProperty: "Consigner")]
    public WayBill ConsignerInverse { get; set; }
}
Другие вопросы по тегам