如何使用Xamari表单中的SQLite为同一个表创建两个外键

如何使用Xamari表单中的SQLite为同一个表创建两个外键,sqlite,xamarin,foreign-keys,sqlite-net-extensions,Sqlite,Xamarin,Foreign Keys,Sqlite Net Extensions,我在一个项目中使用C#与Xamarin表单一起工作。我正在尝试使用以下代码为同一个表创建两个外键: [Table("Posts")] public class Post { [PrimaryKey] public long PostID { get; set; } public string Name { get; set; } public TypeEntity mode = null; [ManyToOne(CascadeOperations = C

我在一个项目中使用C#与Xamarin表单一起工作。我正在尝试使用以下代码为同一个表创建两个外键:

[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; }
}
如您所见,属性模式和级别的类型为“TypeEntty”,因此我需要创建关系。 当我尝试插入数据时,只插入“Mode”属性ok,“Level”属性保持null

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);
    }
}
公共抽象类基址,其中T:new()
{
公共静态sqliteconnectionsql;
公共基存储()
{
sql=DependencyService.Get().GetConnection();
Init();
}
公共void Init()
{
CreateTable();
}
公共无效插入(T实体)
{
sql.InsertWithChildren(实体);
}
}
我切换了属性顺序,我首先添加了Level,然后Level得到了值。这意味着SQLIte只使用第一个属性来创建关系

有人知道为什么这样不行吗


我正在使用SQLite.Net.Core-pcl3.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

必须手动指定与每个关系对应的外键。为此,在每个
ManyToOne
属性中传递
ForeignKey
参数

现在无法测试它,但它可能看起来像这样:

[ManyToOne(ForeignKey = "ModeID", CascadeOperations = CascadeOperation.CascadeInsert)]
public TypeEntity Mode

(...)

[ManyToOne(ForeignKey = "LevelID", CascadeOperations = CascadeOperation.CascadeInsert)]
public TypeEntity Level

redent84非常感谢您宝贵的时间,它工作得很好。@redent84我在同一个表中有一个OneToOne,但它似乎在寻找具有等于foreignkey而不是foreignkey等于primarykey的对象。redent84非常感谢您宝贵的时间,它工作得很好。@redent84我在同一个表中有一个OneToOne,但它似乎在寻找具有等于foreignkey的对象,而不是foreignkey等于primarykey的对象。。