0

比較的単純なドメイン モデルにいくつかの 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 の名前は奇妙MemberNameですが、readme で提案されているように .tt ファイルでそれらに s を指定することでこれに対抗しました。

問題は、タグ オブジェクトの 1 つを取得すると、すべての関連付けプロパティが null になることです。関連するタグは正しいのですが、期待どおりにそれをまたはプロパティ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();
4

2 に答える 2

0

これが私がこの問題を克服した方法です-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; }
}

Association の戻り値の型が 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);
}
于 2014-11-13T12:31:14.173 に答える