我有一个像
这样的实体public class SKU
{
//public int Id { get; set; }
public string FactoruCode { get; set; }
public string Ptoduct { get; set; }
}
和映射定义为
public class SKUMap : ClassMap<SKU>
{
public SKUMap()
{
Table("MST_PRODUCT");
Not.LazyLoad();
Id(x => x.Ptoduct).GeneratedBy.Assigned();
Map(x => x.Ptoduct, "PRODUCT_NAME");
Map(x => x.FactoruCode, "FACTORY_CODE");
}
}
并检索
之类的记录class Program
{
static void Main()
{
var sessionFactory = CreateSessionFactory();
using (var session = sessionFactory.OpenSession())
{
using (session.BeginTransaction())
{
var skus = session.CreateCriteria(typeof(SKU)).List<SKU>();
foreach (var sku in skus)
{
Console.WriteLine(sku.Ptoduct);
}
}
}
}
private static ISessionFactory CreateSessionFactory()
{
var cfg = OracleClientConfiguration.Oracle10
.ConnectionString(c =>
c.Is(
@"DATA SOURCE=SERVER_NAME;PERSIST SECURITYINFO=True;USER ID=USER_ID;Password=PWD"));
return Fluently.Configure()
.Database(cfg).Mappings(m => m.FluentMappings.AddFromAssemblyOf<Program>())
.ExposeConfiguration(BuildSchema).BuildSessionFactory();
}
private static void BuildSchema(NHibernate.Cfg.Configuration config)
{
new SchemaExport(config).Create(false, true);
}
}
但该表的列数多于为实体指定的列数。这段代码执行得很好,但是我无法获得SKU列表(表格超过8000行)。
请帮我理解这个问题。
答案 0 :(得分:2)
您的SKU地图错误。为什么要将PRODUCT_NAME
定义为Id列?您需要通过将Id设置为Id列(已注释掉)来修复它:
Id(x => x.Id, "NAME_OF_YOUR_ID_COLUMN_HERE").GeneratedBy.Assigned();
Map(x => x.Ptoduct, "PRODUCT_NAME");
如果PRODUCT_NAME
确实是Id,则需要将其设置为:
Id(x => x.Ptoduct, "PRODUCT_NAME").GeneratedBy.Assigned();
并删除另一行:
Map(x => x.Ptoduct, "PRODUCT_NAME");
此外,如果您的数据库有更多的字段或表,那么您正在映射,它可能会给您带来很多错误。要解决这些问题,您需要在配置中将use_proxy_validator
设置为false
。
修改强>
NHibernate要求Id列正常工作。我甚至不知道如果没有将列声明为Id列,它确实可以工作。即使您将Ptoduct
声明为Id列,也无法正确查询数据库,因为查询具有相同Ptoduct
的所有对象将返回最顶层的对象。