使用BsonClassMap,是否可以映射域对象引用,同时保持域对象程序集持久无知(将public A Reference { get; set; }
属性更改为public MongoDBRef Reference{ get; set; }
下面的示例类B
不是上可接受的)。
对于这种情况,引用的对象不是同一聚合的一部分,不应存储为嵌套文档。
是否可以在这样的关系中映射两个域对象:
public class A
{
public Guid Id {get; private set; }
}
public class B
{
public Guid Id { get; private set; }
public A Reference { get; set; }
}
进入以下文档结构:
// Collection for class A
{ _id: "11111111-1111-1111-1111-111111111111" }
// Collection class B
{
_id: "22222222-2222-2222-2222-222222222222",
reference_id: "11111111-1111-1111-1111-111111111111"
}
映射可能如下所示:
BsonClassMap.RegisterClassMap<A>(cm =>
{
cm.MapIdProperty(c => c.Id)
.SetIdGenerator(new GuidGenerator())
.SetRepresentation(BsonType.String);
}
BsonClassMap.RegisterClassMap<B>(cm =>
{
cm.MapIdProperty(c => c.Id)
.SetIdGenerator(new GuidGenerator())
.SetRepresentation(BsonType.String);
// How do I map the B.Reference to a manual reference (like
// the sample doc structure above) or possibly as a DBRef?
}
因此,在不更改模型的情况下,如何将Reference
属性映射到对象A
,从对象B
映射为DBRef或手动引用(如我的示例中所示)上面的文件结构)?
使用BsonClassMap可以吗?或者为了使用BsonClassMap并保持我的域程序集持久无知,我是否需要将模型更改为:
public class A
{
public Guid Id {get; private set; }
}
public class B
{
public Guid Id { get; private set; }
public Guid ReferenceId { get; set; } // Don't reference the object directly,
// just store the Guid to the
// referenced object.
}
答案 0 :(得分:2)
我向mongodb-csharp用户组提出了同样的问题并得到了craiggwilson的回复:
您需要将ReferenceProperty更改为ReferencePropertyId。我们不支持延迟加载(或急切加载)引用的文档。
由于A不是B的聚合,因此在讨论这些术语时这实际上更有意义。通常,不必加载引用的聚合(B)以处理引用聚合(A)。可能你确实需要来自B的一些信息。在这种情况下,考虑一点非规范化并创建一个真实实体(BSummary),其聚合为A.如果某些摘要信息不可变或不经常更改,这将是有意义的。