【问题标题】:MongoDB c# driver _id field and SetIdMember()MongoDB c#驱动程序_id字段和SetIdMember()
【发布时间】:2012-12-09 09:16:50
【问题描述】:

我已将类映射的SetIdMember() 设置为指向对象内的元素:

BsonClassMap.RegisterClassMap<Person>(x =>
    {
        x.AutoMap();
        x.SetIdMember(x.GetMemberMap(p => p.PersistedId));
    });

这很好用,但是我正在查看 mongo 数据(通过 MongoVUE)并注意到 PersistedId 字段未存储在数据库中的任何位置,我认为这是因为它将它映射到 _id 字段。

现在对于 99% 的场景,我确信这很好,但是在这种情况下,我使用的是非强类型模型,并拉回原始 BsonDocument,然后将其转换为 JSON 以交给客户端脚本然后使用进一步。然而,它期望在 JSON 中获得一个 PersistedId 字段,但它不存在,它只是 _id。

那么有没有办法让我让它完成整个唯一的 _id 字段的事情,但也让它把 PersistedId 字段也写到数据库中? (我知道它会是重复的数据,但这不是一个大问题)

【问题讨论】:

    标签: c# mongodb mongodb-.net-driver uniqueidentifier


    【解决方案1】:

    您可以添加一个只读属性并让驱动程序知道将其作为 PersistedId 存储在数据库中。

    public class Entity
    {
        public ObjectId Id { get; set; }
    
        public ObjectId PersistedId 
        {
            get { return Id; }
        }
    }
    
    BsonClassMap.RegisterClassMap<Person>(x =>
    {
        x.AutoMap();
        x.MapMember(x => x.PersistedId);
    });
    

    但是,我不确定这是不是最好的主意。您可能不应该在这样的服务器环境中与您的 UI 共享您的数据库模型。相反,您应该从数据库模型映射到 UI 模型。这提供了很多好处,例如聚合模型、转换模型等......因此您的 UI 与您的 UI 如此耦合。但是,归根结底,这是您的决定。

    【讨论】:

    • 在现实世界的情况下,它不像 N 层那样的系统那么清晰。它是一个获取数据并将其持久化的 Web 服务器,模型是客户端和服务器之间的合同模型,然后客户端在 ViewModels 中使用多个这些模型,然后将数据映射到 UI,因此模型本身永远不会直接接触 UI .这主要是因为客户端 (javascript) 应用程序是 MAIN 应用程序,Web 服务器纯粹是用来处理模型的持久性和检索。
    猜你喜欢
    • 2011-08-29
    • 2014-06-20
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多