C# 使用fluent NHibernate映射只读sql视图

C# 使用fluent NHibernate映射只读sql视图,c#,.net,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,C#,.net,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,我试图让Fluent Nhibernate自动映射没有指定主键或复合键的只读视图。这似乎是可能的,因为ClassMap的API文档公开了Id()的默认构造函数 上面说 IdentityPart Id() 创建一个在域对象或数据库中没有相应属性的Id。这主要用于只读访问和/或视图。默认为带有“增量”生成器的整数标识 我已尝试覆盖与视图对应的实体的映射,并删除了指定Id字段名称的主键约定。它向视图上的查询添加一个id列,该查询因没有此类列而失败 我正试图在我的视图中去除假主键,因为我认为应该有更好

我试图让Fluent Nhibernate自动映射没有指定主键或复合键的只读视图。这似乎是可能的,因为ClassMap的API文档公开了Id()的默认构造函数

上面说

IdentityPart Id() 创建一个在域对象或数据库中没有相应属性的Id。这主要用于只读访问和/或视图。默认为带有“增量”生成器的整数标识

我已尝试覆盖与视图对应的实体的映射,并删除了指定Id字段名称的主键约定。它向视图上的查询添加一个
id
列,该查询因没有此类列而失败

我正试图在我的视图中去除假主键,因为我认为应该有更好的方法来做到这一点

下面是我正在使用的覆盖代码段

public class PersonMap: IAutoMappingOverride<Person>
{
    public void Override(AutoMapping<Person> mapping)
    {
        mapping.Id();
    }
}
公共类PersonMap:IAutoMappingOverride
{
公共无效替代(自动映射)
{
mapping.Id();
}
}

为什么这不起作用?

解决方法通常是将任意属性指定为id,并将其由assigned生成。这与绘制地图基本相同

public class ItemViewMap : IAutoMappingOverride<ItemView>
{
    public void Override(AutoMapping<ItemView> mapping)
    {
        mapping.Id(x => x.Column).GeneratedBy.Assigned();
    }
}
public类ItemViewMap:IAutoMappingOverride
{
公共无效替代(自动映射)
{
Id(x=>x.Column).GeneratedBy.Assigned();
}
}

这不正是OP不想做的吗?不,他只是规定他不想拥有一个伪造的、无用的主键。我建议他使用一个实际上对他有价值的列,并将其映射为ID而不是常规属性。这对nhibernate没有任何影响,应该可以帮助他解决这个问题。因为这些都是sql视图,所以唯一性有时必须由许多属性决定。要实现这一点,必须建立复合键,并重写实体的Equals和GetHashCode方法。我的希望是,我可以绕过建立任何id,因为它是一个只读结构。