繁体   English   中英

具有SQLite的LinqToDB-引用属性为null

[英]LinqToDB with SQLite - reference properties are null

我有一些相对简单的域模型上的POCO。 一个示例如下所示:

[Table("Tag")]
public partial class Tag
{
    [PrimaryKey, NotNull    ] public string Name        { get; set; } // varchar(128)
    [Column,        Nullable] public string Description { get; set; } // text(2147483647)
    [Column,        Nullable] public string ParentID    { get; set; } // varchar(128)

    #region Associations

    /// <summary>
    /// FK_Tag_0_0
    /// </summary>
    [Association(ThisKey="ParentID", OtherKey="Name", CanBeNull=true)]
    public Tag Parent { get; set; }

    /// <summary>
    /// FK_TagObjects_0_0_BackReference
    /// </summary>
    [Association(ThisKey="Name", OtherKey="TagID", CanBeNull=true)]
    public List<TagObject> ObjectLinks { get; set; }

    /// <summary>
    /// FK_TagSynonyms_0_0_BackReference
    /// </summary>
    [Association(ThisKey="Name", OtherKey="TagID", CanBeNull=true)]
    public List<TagSynonym> SynonymLinks { get; set; }

    /// <summary>
    /// FK_Tag_0_0_BackReference
    /// </summary>
    [Association(ThisKey="Name", OtherKey="ParentID", CanBeNull=true)]
    public List<Tag> Children { get; set; }

    #endregion
}

FK的名称很奇怪,但我通过在.tt文件中为它们指定MemberName来解决,就像自述文件所建议的那样。

问题是,当我抓取一个标签对象时,所有关联属性都为空-相关标签的ParentID是正确的,似乎并没有像我期望的那样将其映射到Parent Children属性。

我在这里做错了吗? 我已经仔细检查了数据库本身。 .tt看起来像这样:

NamespaceName = "MyProg.Models";
GenerateBackReferences   = true;
OneToManyAssociationType = "List<{0}>";

LoadSQLiteMetadata(@"C:\my\path", "my.db");

var k = GetFK("Tag", "FK_Tag_0_0");
k.MemberName = "Parent";
k.BackReference.MemberName = "Children";

GenerateModel();

这就是我克服此问题的方式-请注意,我正在使用Access数据库。

[Table(Name = "Customers")]
public class Customer
{
    [PrimaryKey, Identity]
    public int CompanyID { get; set; }

    [Column(Name="CompanyName"), NotNull]
    public string Name { get; set; }

    [Association(OtherKey = "CompanyID", ThisKey = "CompanyID", CanBeNull = true)]
    public Account Accounts { get; set; }
}

当关联返回类型为IEnumrable时,以下用法返回IQueryable'<'IEnumerable'<'Account >>。

用法:

using (var db = new DbMain())
{
     var q = from c in db.Customers
             select c.Accounts;

     System.Diagnostics.Debug.Print(q.ToList()[0].AccountID);
}

在linq2db中,关联定义表之间的关系。 它们有助于使用关联属性导航来构建跨表LINQ查询,而不是(对于我而言)笨拙的LINQ连接语法。

如果需要用select数据填充关联属性,则必须使用LoadWith方法在查询中显式指定关联属性:

var tagsWithChildren = db.Tags.LoadWith(t => t.Children).ToList();

可以在以下测试中找到更多示例: https : //github.com/linq2db/linq2db/blob/master/Tests/Linq/Linq/LoadWithTests.cs

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM