带有 SQLite 的 LinqToDB - 引用属性为空
Posted
技术标签:
【中文标题】带有 SQLite 的 LinqToDB - 引用属性为空【英文标题】:LinqToDB with SQLite - reference properties are null 【发布时间】:2014-10-07 06:56:33 【问题描述】:我在一个相对简单的域模型上有几个 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
s 来反驳这一点,就像自述文件建议的那样。
问题是,当我抓取我的一个标签对象时,所有关联属性都是空的 - 相关标签的 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();
【问题讨论】:
【参考方案1】:在 linq2db 中,关联定义了表之间的关系。它们有助于使用关联属性导航构建跨表 LINQ 查询,而不是笨拙的(对我而言)LINQ 连接语法。
如果您需要在选择时使用数据填充关联属性,则必须使用LoadWith
方法在查询中明确指定:
var tagsWithChildren = db.Tags.LoadWith(t => t.Children).ToList();
更多示例可以在此处的测试中找到:https://github.com/linq2db/linq2db/blob/master/Tests/Linq/Linq/LoadWithTests.cs
【讨论】:
这需要将LinqToDB.Common.Configuration.Linq.AllowMultipleQuery
设置为true
【参考方案2】:
这就是我克服这个问题的方法 - 请注意我使用的是 Access db。
[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'>。
用法:
using (var db = new DbMain())
var q = from c in db.Customers
select c.Accounts;
System.Diagnostics.Debug.Print(q.ToList()[0].AccountID);
【讨论】:
感谢您的回答!但是,我不确定这与我自己的设置有何不同。无论哪种情况,我都决定放弃 LinqToDB,但这些信息可能对其他人有用。 :)以上是关于带有 SQLite 的 LinqToDB - 引用属性为空的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 EF Core 或 LinqToDb EF Core Tools 或 ADO.NET 运行任何存储过程创建脚本