C#MongoDB:如何映射域对象(Id属性需要BsonIgnoreIfDefault)

时间:2014-01-17 01:03:07

标签: c# .net mongodb domain-driven-design mongodb-.net-driver

我已经开始了一个小而简单的项目(一个非常原始的博客)来获得DDD的实践经验,而我相信我理解了我还没有能够解决以下问题的基本概念。

鉴于POCO对象'post',我想使用存储库来保存它,使用带有upsert参数的mongodb collection.update方法实现(参见下面的代码)

public Post Save(Post p)
{
    var wc = collection.Update(
    Query<Post>.EQ<string>(p0 => p0.permalink, p.permalink),
    Update<Post>.Replace(p),
    UpdateFlags.Upsert);
    return p;
}

但是,似乎有必要将特定于mongodb的属性应用于您的Id字段,以便upsert正常工作,详见答案:https://stackoverflow.com/a/20224022/741695

因此,我只能看到两种可能的行动方式:

1)将mongodb程序集的引用添加到我的域库项目中,但感觉不对,因为mongodb是存储库实现细节(因此属于DAL)

2)将“post”实例(poco域对象)传递给PostRepository实现,并通过将域对象映射到DTO来处理与之相关的任何与实现相关的问题

虽然第二个解决方案似乎符合DDD原则,但实施起来比第一个解决方案更昂贵,所以我想知道是否有更好的选择。

提前感谢您的反馈。

1 个答案:

答案 0 :(得分:2)

您不必使用该属性来映射ID,您无法使用RegisterClassMap在DAL中执行此操作:

BsonClassMap.RegisterClassMap<Post>(cm =>
{
    cm.AutoMap();
    cm.SetIdMember(cm.GetMemberMap(p => p.Id));
});

BTW:你可以在不映射Id的情况下进行upsert,你就是不能使用简单的Update<Post>.Replace(p)。您需要自己创建更新。