2012-11-17 23 views
1

我有一个链接表,并且一些链接将是子链接,引用父链接ID 但是我无法绕过服务栈ormlite和填充子项的属性,将在获得所有链接列表时的所有子链接。服务栈ormlite和外键到同一张表

这里是我的模型:

public partial class Navigation 
{ 
    [Alias("Id"), AutoIncrement] 
    public int Id { get; set; } 

    [Alias("ParentId")] 
    [Display(Name = "ParentId")] 
    [References(typeof(Navigation))] 
    public int? ParentId { get; set; } 

    [Alias("LinkText")] 
    [StringLength(50, ErrorMessage = " Must be no more than 50 characters long!")] 
    [Display(Name = "LinkText")] 
    public string LinkText { get; set; } 

    [Alias("Action")] 
    [StringLength(50, ErrorMessage = " Must be no more than 50 characters long!")] 
    [Display(Name = "Action")] 
    public string Action { get; set; } 

    [Alias("Controller")] 
    [StringLength(50, ErrorMessage = " Must be no more than 50 characters long!")] 
    [Display(Name = "Controller")] 
    public string Controller { get; set; } 

    [Alias("Area")] 
    [StringLength(50, ErrorMessage = " Must be no more than 50 characters long!")] 
    [Display(Name = "Area")] 
    public string Area { get; set; } 

    [Alias("Visible")] 
    [Display(Name = "Visible"),Required(ErrorMessage = " is required")] 
    public bool Visible { get; set; } 

    [Alias("Sequence")] 
    [Display(Name = "Sequence")] 
    public int? Sequence { get; set; } 

    [ForeignKey(typeof(Navigation))] 
    public virtual ICollection<Navigation> Children { get; set; } 
} 

什么想法?

回答

0

OrmLite中的表严格为1:1映射与基础数据库表。

这意味着所有复杂类型的属性都是blobbed到属性名称的数据库文本字段中,它们从未用于自动映射到子关系,因为您期望在此处执行此操作。

这里有一个早期的答案,显示你可以如何map many to many relations with OrmLite

+0

是有一个快速的方法,我可以做到这一点,例如,创建我的最终结果模型并具有再填充,因为我需要它,上面的是现有项目的相当大一部分,它使用实体框架在这一刻,我试图证明,ormlite将能够处理这样的事情,在项目中没有太大的麻烦,不真正理解你发给我的链接真的,我不想插入,只是提供结果。谢谢 – davethecoder

+0

我没有时间自己做这些,但是你可以做一个扩展方法,其行为与你想要的相似,例如, 'model.Children ()'使用反射来查看src +子表并使用约定来构建相应的sql想要的。 – mythz

3

你可以用继承来做到这一点。父类将包含对子类的引用。我不得不使用它来获取哪个用户创建了每个用户。下面是一个示例:

public class UserCommon 
{ 
    [References(typeof(User))] // Self reference workaround for User ;) 
    public Guid CreatedBy { get; set; } 
} 

public class User : UserCommon 
{ 
    public Guid Uid { get; set; } 
    public String Username { get; set; } 
    public String Password { get; set; } 
} 

东西,你需要注意的是,包括在子类中没有父Id。将生成的表格如下。外键是一个自我参考

Generated Table

让孩子们的名单应该是一个简单的LINQ查询,将获取所有的孩子一定父GUID作为容易。 CreatedBy也是User继承的财产。

db.Select<User>(q => q.CreatedBy == '734FD814-024D-4795-AFD0-34FECF89A13A'); 
// Just a sample Guid, you should be able to select 
// the Guid you need and insert it here. 
+0

你为什么要带去去年的一个帖子?甚至没有给这个奖励,不得不放弃或者使用其他东西来处理它,我不认为我会重新开放一个完成的项目来重新做所有的工作,尽管说实话,好的解决方案只是羞辱它3个月后:-) – davethecoder

+4

嗯,我刚刚开始使用OrmLite,因为您知道StackOverflow是一个社区。我的经验可能对未来寻找相同事物的人有益。 –