gpt4 book ai didi

ServiceStack/ORM Lite - 外键关系

转载 作者:行者123 更新时间:2023-12-04 05:23:24 26 4
gpt4 key购买 nike

我有以下 POCO:

[Alias("Posts")]
public class Post : IReturn<Post>
{
[AutoIncrement]
[PrimaryKey]
public int PostId { get; set; }
public DateTime CreatedDate { get; set; }
[StringLength(50)]
public string CreatedBy { get; set; }
[StringLength(75)]
public string Title { get; set; }
public string Body { get; set; }
public int UpVote { get; set; }
public int DownVote { get; set; }
public bool IsPublished { get; set; }

public List<Comment> Comments { get; set; }
public List<Tag> Tags { get; set; }
}

它在我的 CommentTag 实体上有一个 FK。所以我想在我的服务回复中返回这些,但它说 'Invalid Column name 'Comments'''Invalid Column name 'Tags'' 。如何使用 ORM Lite 查看哪些评论和标签附加到我的帖子?在 EF 中我会简单地使用 Include 来延迟加载我的相关表信息,什么是等价的?

编辑

作为对答案的回应,我这样做了:

public class PostFull
{
public Post Post { get; set; }
public List<Comment> Comments { get; set; }
public List<Tag> Tags { get; set; }
}

然后在我的服务中,我返回这个,我的实体 PostTag 是一个交集实体,因为我的 PostTag 实体是一个 M: M 关系:

var posts = Db.Select<Post>().ToList();
var fullPosts = new List<PostFull>();

posts.ForEach(delegate(Post post)
{
var postTags = Db.Select<PostTag>(x => x.Where(y => y.PostId ==
post.PostId)).ToList();

fullPosts.Add(new PostFull()
{
Post = post,
Tags = Db.Select<Tag>(x => x.Where(y => postTags.Select(z =>
z.TagId).Contains(y.TagId))).ToList(),
Comments = Db.Select<Comment>(x => x.Where(y => y.PostId ==
post.PostId)).ToList()
});
});

return fullPosts;

不确定它是否是一个好的设计模式?

编辑 2

这是我的实体:

[Alias("Tags")]
public class Tag
{
[AutoIncrement]
[PrimaryKey]
public int TagId { get; set; }

[StringLength(50)]
public string Name { get; set; }
}

[Alias("Posts")]
public class Post
{
[AutoIncrement]
[PrimaryKey]
public int PostId { get; set; }
public DateTime CreatedDate { get; set; }
[StringLength(50)]
public string CreatedBy { get; set; }
[StringLength(75)]
public string Title { get; set; }
public string Body { get; set; }
}

[Alias("PostTags")]
public class PostTag
{
[AutoIncrement]
[PrimaryKey]
public int PostTagId { get; set; }

[References(typeof(Post))]
public int PostId { get; set; }

[References(typeof(Tag))]
public int TagId { get; set; }
}

最佳答案

OrmLite 中的表与底层数据库表严格1:1 映射

这意味着所有复杂类型的属性都blobbed到带有属性名称的数据库文本字段中,它们永远不会像您在这里期望的那样自动映射到子关系。

这是一个早期的答案,告诉你如何 map many to many relations with OrmLite .

尽量避免 N+1 查询,记住每次对 Db.x 的调用都是远程数据库查询,因此您最好尽量避免在环形。

Retrieving Posts by Many to Many Table query

您可以使用 OrmLite's support for JOINs像在普通 SQL 中那样构造一个 Typed 查询,通过多对多表查询并查找具有指定标签的所有帖子:

使用测试数据创建和填充帖子
db.CreateTable<Post>();
db.CreateTable<Tag>();
db.CreateTable<PostTag>();

var post1Id = db.Insert(new Post {
CreatedBy = "gistlyn", Title = "Post 1", Body = "Body 1" }, selectIdentity:true);
var post2Id = db.Insert(new Post {
CreatedBy = "gistlyn", Title = "Post 2", Body = "Body 2" }, selectIdentity:true);
db.Insert(new Tag { Id = 1, Name = "A" },
new Tag { Id = 2, Name = "B" });
db.Insert(new PostTag { PostId = post1Id, TagId = 1 },
new PostTag { PostId = post1Id, TagId = 2 });
db.Insert(new PostTag { PostId = post2Id, TagId = 1 });

创建一个连接所有相关表的 SQL 表达式:

当遵循上述 OrmLite 的正常命名约定时,OrmLite can infer the relationship between each table使您免于为每个查询指定 JOIN 表达式,例如:

var postsWithTagB = db.Select(db.From<Post>()
.Join<PostTag>()
.Join<PostTag,Tag>()
.Where<Tag>(x => x.Name == "B"));
postsWithTagB.PrintDump();

此查询仅返回标签 B 的第一个帖子和标签 A 的两个帖子。

您可以通过 running it Live on Gistlyn 在线进一步探索这个独立示例.

使用标签和评论填充所有帖子

如果这是一个小型博客,并且您想加载所有带有相关标签和评论的帖子,例如在主页或 RSS 提要中,您可以使用 Linq2Objects 将整个数据集加载到内存中,并使用 4 个查询将它们与以下内容连接起来:

//Only 4 DB calls to read all table data
var posts = Db.Select<Post>();
var postTags = Db.Select<PostTag>();
var tags = Db.Select<Tag>();
var comments = Db.Select<Comment>();

//using Linq2Objects to stitch the data together
var fullPosts = posts.ConvertAll(post =>
{
var postTagIds = postTags
.Where(x => x.PostId == post.PostId)
.Select(x => x.PostTagId).ToList();

return new PostFull {
Post = post,
Tags = tags.Where(x => postTagIds.Contains(x.TagId)).ToList(),
Comments = comments.Where(x => x.PostId == post.PostId).ToList(),
};
});

关于ServiceStack/ORM Lite - 外键关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14504090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com