我正在尝试创建一个没有主键/引用的数据库表的映射。
public class TestMap : ClassMap<<Test>Test> {
public TestMap() {
WithTable("TestTable");
Map(x => x.TestColumn);
}
}
这失败并期望id或composite-id。这是否可以流利的nhibernate?
答案 0 :(得分:4)
至少在Oracle中,我使用了“ROWID”。对于mssql,你可以使用“ROW_NUMBER()”内置函数来只读访问表,但我还没试过......
答案 1 :(得分:2)
没有。您必须添加代理主键(例如SQL Server中的标识列)才能映射此表。据我所知,NHibernate本身并不支持。
为什么这张桌子上没有主键?
答案 2 :(得分:0)
据我所知,nhibernate不支持此功能。但是,作为一般的经验法则,您应该总是拥有某种ID,如果您发现自己处于一种您认为不需要ID的情况,那么您应该评估您的数据模型。应该存在ID,无论是特定于表的主键还是来自另一个表的代理键。这不仅可以确保nhibernate可以处理表,还可以通过索引来帮助提高性能。
在你开始假设nhibernate不能满足你的需求之前,请考虑为什么你没有桌子上的钥匙以及没有钥匙的感觉。
答案 3 :(得分:0)
如果我们可以从没有主键/标识列的表中引入一列,那么我们可以使用如下流程:
Id(x => x.TempID).Column("TempID");
答案 4 :(得分:0)
如果表格包含属于其他实体的数据,您可以将其映射为组件的集合。组件本身不是标识,但它们属于另一个 标识的实体。
答案 5 :(得分:0)
您可以将实体映射到表,而不在数据库中定义键。我在旧版SQL Server数据库中这样做。但是,该表必须具有候选键(某些列实际存储唯一的值组合)。 实体的概念涉及某种身份的概念。 而不是这个,你在代码中尝试的是映射一个没有身份的实体,这是不可能的。