2

将多个一对一关系建模到同一个表(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):Waybill -->> WayBillOrganization --> Organization

  2. 将所需的反向 OneToMany 属性放入组织中。

  3. 手动处理事情(即仅在 WayBill 类中存储主键并单独加载组织)。

选项 2. 是我想避免的。组织与许多其他类别相关(在我的示例中没有),即使在运单的情况下,还有一些我没有包含在示例中的关系(承运人、货物支付方、货运代理等)。另外,我宁愿只在需要导航时才使用逆属性(例如,我不使用组织来查找运单,所以逆属性只是一个额外的负担。)

选项 3. 也没有那么吸引人。

所以选项 1. 似乎是要走的路。但在去那里之前,我想知道我的示例中的完美世界解决方案是否确实是不可能的。

所以,我的问题是:有没有一种方法可以在没有明确声明逆属性的情况下对多个单向OneToOne 关系进行建模?

4

1 回答 1

4

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; }
}
于 2015-12-09T16:19:56.793 回答