流利的nhibernate:没有得到记录

时间:2011-01-13 14:36:47

标签: fluent-nhibernate

我有一个像

这样的实体
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行)。

请帮我理解这个问题。

1 个答案:

答案 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的所有对象将返回最顶层的对象。