23

我想知道使用引用进行建模的最佳实践是什么情况。我正在使用MongoRepository库。

public class User : Entity
{
   publis string Id { get; set; }
   public string Email { get; set; }
   public string Password { get; set; }
}

public class Post : Entity
{
   public string Id { get; set; }
   public string Title { get; set; }
   public string Summary { get; set; }
   public DateTime Added { get; set; }
   public User Owner { get; set; }
}

存储帖子时,我只想引用所有者(用户)对象而不是底层的整个对象。

目前我正在这样做,不知道更好的方法......

var post = new Post
{
   Title = "Example title",
   Summary = "asd asd",
   Added = DateTime.Now,
   Owner = new User { Id = "someExistingUserId" }
};
postRepository.Update(post); //Save

..

//Then to get the post
var post = postRepository.GetById("previouslySavedPostId");
post.Owner = userRepository.GetById(post.Owner.Id);
return post;

userRepository 和 postRepository 是 MongoRepository 类型。

这是使用带有 C#/MVC(4) 的 MongoDB 解决我的问题的正确方法吗?

4

2 回答 2

28

您可以使用MongoDBRef对象而不是用户对象。

public class Post : Entity
{
    public string Id { get; set; }
    public string Title { get; set; }
    public string Summary { get; set; }
    public DateTime Added { get; set; }
    public MongoDBRef Owner { get; set; }
}    

那么你就可以:

var mongo = new Mongo(config.BuildConfiguration());
mongo.Connect();        
var DB = mongo.GetDatabase(_dataBaseName)

var post = new Post();
post.Owner = new MongoDBRef("User", userId); // First parameter is a mongoDB collection name and second is object id
// To fetch object referenced by DBRef you should do following
var owner = DB.FollowReference<User>(post.Owner);
于 2013-03-06T13:01:59.337 回答
13

Mongo 是一个文档数据库,如果您习惯使用 sql server,则需要稍微不同的思维方式。

由于您不希望在每个帖子中都包含用户密码详细信息,因此我可能会创建一个新类来包含显示帖子可能需要的任何用户信息。

public class PostOwnerInfo
{
    public string UserId { get; set; }
    public string Name { get; set; }
}

更新您的帖子实体,将 Owner 属性替换为 PostOwnerInfo 类型的 OwnerInfo 属性。

然后,当您创建新帖子时,请执行以下操作。

var user = userRepository.GetById(someExistingUserId);

var post = new Post
{
   Title = "Example title",
   Summary = "Example summary",
   Added = DateTime.Now,
   OwnerInfo = new PostOwnerInfo
   {
        UserId = user.Id,
        Name = user.Name
   }
};

postRepository.Update(post);

这样,当您查询帖子时,它将拥有您在其 OwnerInfo 属性中显示帖子所需的所有用户信息,而无需进一步查询。

var post = postRepository.GetById(previouslySavedPostId);
// post.OwnerInfo will contain user info

有一定数量的数据冗余,但在文档数据库中我会这样做。

如果您出于任何原因需要完整的用户信息,只需像以前一样单独查询即可。

这个想法是您将帖子所需的所有用户信息存储在帖子的子文档中,因此您不需要为用户执行单独的查询。

如果用户数据发生变化,只需更新用户发布的所有帖子的 UserInfo 字段。

您的用户数据很少会更改,但您会经常查询帖子。

于 2013-02-14T15:44:23.720 回答