我有类似这样的设计(虽然有小小的,纤细有点复杂):许多一对多具有唯一约束和有条件更新
这是一个多对多多种关系。扫描可以拥有许多定位的页面,但定位的页面可能属于许多扫描。
我遇到的麻烦是我不知道如何在URL上添加一个唯一的约束,这样当扫描页面被保存并且具有这样的URL的条目已经存在时,它不应该创建一个新的一。相反,新的scan_locatedpage条目应链接到已存在的定位页面,并且(如果不同)更新其校验和。
只,我不知道该怎么做。
目前我的代码看起来是这样的:
public LocatedPageMap()
{
Id(x => x.Id);
Map(x => x.Url)
.Not.Nullable();
Map(x => x.Checksum);
HasManyToMany(x => x.ScansFoundWith)
.Cascade.All()
.Inverse()
.Table("Scan_LocatedPage");
}
public ScanMap()
{
Id(x => x.Id);
Map(x => x.Date)
.Not.Nullable();
HasManyToMany(x => x.Located_Pages)
.Cascade.SaveUpdate()
.Table("Scan_LocatedPage");
}
当然,这是行不通的。每次保存新的扫描时,都会添加一个新的位于页面的页面,尽管存在Url。
我不知道如何实现这种效果,我不确定在哪里/如何看。我已经阅读了一系列标题为“独特”的多对多问题,但没有发现任何有用的东西。当然'因为我不确定要查找什么。
编辑
或者,也许我应该简单地将情况处理程序为我的应用程序逻辑,而不是指望流利的照顾,对我?
这是评论的第三版本,我发现它确实不直观,“Enter”键用于提交。 :]回到话题:你是对的,一对多和多对一的关系可能会是一个更好的解决方案。你能否告诉我一个简单的例子,看看这样的转换是怎么样的?我不确定我是否正确。 :)此外,我只是有点不确定我应该在链接实体中存储什么样的数据。这些应该是“联系特定的”,还是那些能够访问而不查询其他实体的表的访问者呢? :) – moskalak
请尝试阅读此:http://stackoverflow.com/q/15510748/1679310,在这里我试图解释这一点。或者这里的类似http://stackoverflow.com/q/19687006/1679310。最大的优点是简化了处理。你可以在子查询中看到示例(http://stackoverflow.com/q/18363386/1679310)。因此,您可以稍后通过查询配对对象来找到一些“Scan”或“LocatedPage”... –