2013-02-14 43 views
14

我想知道通過使用引用進行建模的最佳做法是什麼情況下。我正在使用MongoRepository庫。MongoDB最佳做法,供參考

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類型。

這是正確的做法,以使用MongoDB的用C#解決我的問題/ MVC(4)?

回答

18

您可以使用DBRef對象而不是User對象。

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 DBRef Owner { get; set; } 
    }  

然後,您可以:

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

    var post = new Post(); 
    post.Owner = new DBRef("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); 
+1

DBRef和FollowReference不存在 – iYonatan 2017-01-14 14:10:29

10

蒙戈是文檔數據庫,如果你習慣使用的SQL Server它需要的思維方式略有不同。

當你不希望在每一個崗位的用戶密碼的詳細信息,我可能會做的方式是創建一個新的類,包括可能需要顯示後的任何用戶信息。

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

更新您的文章的實體,與OwnerInfo屬性中替換Owner屬性,類型PostOwnerInfo的。

然後,當您創建新帖子時,請執行以下操作。

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 

有一定量的數據冗餘,但在一個數據庫文件,這是我應該怎樣做。

如果您需要任何理由完整的用戶信息只是做一個單獨的查詢它,你做之前。

這個想法是,您將所有用戶信息存儲在帖子的子文檔中,因此您不需要爲用戶執行單獨的查詢。

如果用戶數據chages,只需更新由用戶進行的所有帖子用戶信息領域。

您的用戶數據將很少改變,但你會經常查詢的帖子。

+0

這是我會盡量避免通過引用。如果我更改了用戶,那麼它將與帖子中的用戶不同。在Post中存儲用戶會很糟糕,因爲它包含用戶名,密碼等。需要一個聰明的「開眼」方法... – Xatep 2013-02-14 22:48:32

+0

是的你是正確的。真的不想在每個帖子中存儲密碼數據。更新我的回答 – 2013-02-15 00:15:34