SQLite网络扩展—两个实体之间的一对一和一对多关系

SQLite网络扩展—两个实体之间的一对一和一对多关系,sqlite,xamarin,sqlite-net,sqlite-net-extensions,Sqlite,Xamarin,Sqlite Net,Sqlite Net Extensions,我正在使用SQLite Net PCL和SQLite Net扩展来开发使用Xamarin的应用程序 在我的模型中,我有两个实体,我们称它们为A和B,它们通过一对一和一对多的关系连接起来。例如,A与B有一对一的关系,A与B也有一对多的关系 是否可以用SQLite Net extensions来表示这种行为?是的,但必须在关系属性中显式声明外键和反向属性,否则库可能会为关系获取错误的外键 公共类ClassA { [主密钥,自动增量] 公共int Id{get;set;} [OneToMany(“O2

我正在使用SQLite Net PCL和SQLite Net扩展来开发使用Xamarin的应用程序

在我的模型中,我有两个实体,我们称它们为A和B,它们通过一对一和一对多的关系连接起来。例如,A与B有一对一的关系,A与B也有一对多的关系


是否可以用SQLite Net extensions来表示这种行为?

是的,但必须在关系属性中显式声明外键和反向属性,否则库可能会为关系获取错误的外键

公共类ClassA
{
[主密钥,自动增量]
公共int Id{get;set;}
[OneToMany(“O2MClassAKey”、“BObjectsInverse”)]
公共列表对象{get;set;}
[OneTONE(“O2OClassAKey”、“BobObjectInverse”)]
公共类B对象{get;set;}
//其他属性
公共字符串条{get;set;}
}
公共B类
{
[主密钥,自动增量]
公共int Id{get;set;}
[外键(类别A))]
public int O2MClassAKey{get;set;}
[外键(类别A))]
公共int O2OClassAKey{get;set;}
//反向关系,这些是可选的
[多通(“O2MClassAKey”、“BobObjects”)]
public ClassA BObjectsInverse{get;set;}
[OneTONE(“O2OClassAKey”、“BobObject”)]
public ClassA bobObjectInverse{get;set;}
//其他属性
公共字符串Foo{get;set;}
}
请注意,
OneToOne
关系的外键可以在任何类中声明

如果不需要反转特性,可以在“关系”属性中跳过它们:

公共类ClassA
{
[主密钥,自动增量]
公共int Id{get;set;}
[OneToMany(“O2MclassMakey”)]
公共列表对象{get;set;}
[OneTONE(“O2OClassAKey”)]
公共类B对象{get;set;}
//其他属性
公共字符串条{get;set;}
}
公共B类
{
[主密钥,自动增量]
公共int Id{get;set;}
[外键(类别A))]
public int O2MClassAKey{get;set;}
[外键(类别A))]
公共int O2OClassAKey{get;set;}
//其他属性
公共字符串Foo{get;set;}
}

谢谢你的回答@redent84,这正是我想要的。我只是不太清楚你所说的“oneToMany关系的外键可以在任何类中声明”是什么意思。对不起,这是一个输入错误。我的意思是说
OneToOne
属性。一对一关系的外键可以位于任意两端。插入具有关系的行时,必须调用
.UpdateWithChildren
,才能在数据库中更新关系。我为此奋斗了数小时,试图弄明白为什么我所有的关系都被存储为空。2.如果需要,请不要忘记您的
cascade操作
ReadOnly
标记。@JLWest是,插入后必须
InsertWithChildren
UpdateWithChildren
,才能更新关系。@根据我的经验,
InsertWithChildren
InsertOrReplaceWithChildren
不会正确更新数据库中的关系。在调用
UpdateWithChildren