如何使用 Xamarin Form 中的 SQLite 创建两个相同 table 的外键
How to create two foreign keys to the same table with SQLite in Xamari Form
我在一个使用 C# 的 Xamarin Form 项目中工作。我正在尝试为同一个 table 创建两个外键,使用此代码:
[Table("Posts")]
public class Post
{
[PrimaryKey]
public long PostID { get; set; }
public string Name { get; set; }
public TypeEntity mode = null;
[ManyToOne(CascadeOperations = CascadeOperation.CascadeInsert)]
public TypeEntity Mode
{
get
{
return mode;
}
set
{
mode = value;
}
}
[ForeignKey(typeof(TypeEntity))]
public long ModeID { get; set; }
public TypeEntity level = null;
[ManyToOne(CascadeOperations = CascadeOperation.CascadeInsert)]
public TypeEntity Level
{
get
{
return level;
}
set
{
level = value;
}
}
[ForeignKey(typeof(TypeEntity))]
public long LevelID { get; set; }
}
[Table("Types")]
public class TypeEntity
{
[PrimaryKey]
public long TypeID { get; set; }
public string Code { get; set; }
public string Name { get; set; }
}
如您所见,属性 Mode 和 Level 的类型为 "TypeEntty",因此我需要创建关系。
当我尝试插入数据时,只有 "Mode" 属性 可以插入,"Level" 属性 保持为空。
public abstract class BaseStore<T> where T : new()
{
public static SQLiteConnection sql;
public BaseStore()
{
sql = DependencyService.Get<ISQLite>().GetConnection();
Init();
}
public void Init()
{
sql.CreateTable<T>();
}
public void Insert(T entity)
{
sql.InsertWithChildren(entity);
}
}
调换属性顺序,先加Level,后加Mode,Level取值。这意味着,SQLIte 只需要第一个 属性 来创建关系。
有谁知道为什么这不起作用?
我正在使用 SQLite.Net.Core-PCL 3.1.1 和 SQLiteNetExtensions 2.1.0。
您必须手动指定每个关系对应于哪个外键。为此,请在每个 ManyToOne
属性中传递 ForeignKey
参数。
现在无法测试,但它可能看起来像这样:
[ManyToOne(ForeignKey = "ModeID", CascadeOperations = CascadeOperation.CascadeInsert)]
public TypeEntity Mode
(...)
[ManyToOne(ForeignKey = "LevelID", CascadeOperations = CascadeOperation.CascadeInsert)]
public TypeEntity Level
我在一个使用 C# 的 Xamarin Form 项目中工作。我正在尝试为同一个 table 创建两个外键,使用此代码:
[Table("Posts")]
public class Post
{
[PrimaryKey]
public long PostID { get; set; }
public string Name { get; set; }
public TypeEntity mode = null;
[ManyToOne(CascadeOperations = CascadeOperation.CascadeInsert)]
public TypeEntity Mode
{
get
{
return mode;
}
set
{
mode = value;
}
}
[ForeignKey(typeof(TypeEntity))]
public long ModeID { get; set; }
public TypeEntity level = null;
[ManyToOne(CascadeOperations = CascadeOperation.CascadeInsert)]
public TypeEntity Level
{
get
{
return level;
}
set
{
level = value;
}
}
[ForeignKey(typeof(TypeEntity))]
public long LevelID { get; set; }
}
[Table("Types")]
public class TypeEntity
{
[PrimaryKey]
public long TypeID { get; set; }
public string Code { get; set; }
public string Name { get; set; }
}
如您所见,属性 Mode 和 Level 的类型为 "TypeEntty",因此我需要创建关系。 当我尝试插入数据时,只有 "Mode" 属性 可以插入,"Level" 属性 保持为空。
public abstract class BaseStore<T> where T : new()
{
public static SQLiteConnection sql;
public BaseStore()
{
sql = DependencyService.Get<ISQLite>().GetConnection();
Init();
}
public void Init()
{
sql.CreateTable<T>();
}
public void Insert(T entity)
{
sql.InsertWithChildren(entity);
}
}
调换属性顺序,先加Level,后加Mode,Level取值。这意味着,SQLIte 只需要第一个 属性 来创建关系。
有谁知道为什么这不起作用?
我正在使用 SQLite.Net.Core-PCL 3.1.1 和 SQLiteNetExtensions 2.1.0。
您必须手动指定每个关系对应于哪个外键。为此,请在每个 ManyToOne
属性中传递 ForeignKey
参数。
现在无法测试,但它可能看起来像这样:
[ManyToOne(ForeignKey = "ModeID", CascadeOperations = CascadeOperation.CascadeInsert)]
public TypeEntity Mode
(...)
[ManyToOne(ForeignKey = "LevelID", CascadeOperations = CascadeOperation.CascadeInsert)]
public TypeEntity Level