我有个实体
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多行)。
请帮助我理解这个问题。
发布于 2011-01-13 15:01:00
你的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查询所有对象都会返回最顶层的对象。
https://stackoverflow.com/questions/4681201
复制相似问题