【问题标题】:How to create two foreign keys to the same table with SQLite in Xamari Form如何在 Xamarin 表单中使用 SQLite 创建同一个表的两个外键
【发布时间】:2020-05-30 22:13:11
【问题描述】:

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

[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”,所以我需要创建关系。 当我尝试插入数据时,只有“模式”属性插入正常,“级别”属性保持为空。

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。

【问题讨论】:

    标签: sqlite xamarin foreign-keys sqlite-net-extensions


    【解决方案1】:

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

    目前无法对其进行测试,但它可能看起来像这样:

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

    【讨论】:

    • redent84 非常感谢您宝贵的时间,它运行良好。
    • @redent84 我在同一个表中有一个 OneToOne,但它似乎在寻找具有等于外键而不是外键等于主键的对象..
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    相关资源
    最近更新 更多