2011-01-13 6 views
0

ich eine Einheit haben wiefließend-nhibernate: nicht die Datensätze immer

public class SKU 
{ 
    //public int Id { get; set; } 
    public string FactoruCode { get; set; } 
    public string Ptoduct { get; set; } 
} 

und Mapping definiert als

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"); 
     } 
    } 

und das Abrufen der Datensätze wie

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); 
    } 

} 

aber die Tabelle mehr Spalten als für Entität angegeben. Dieser Code wird zwar gut ausgeführt, aber ich kann die Liste der SKUs nicht abrufen (die Tabelle enthält mehr als 8000 Zeilen).

Bitte helfen Sie mir, das Problem zu verstehen.

+0

Sie sagen, dass der Code gut ausgeführt wird und bitten Sie um Hilfe, um einen Fehler zu verstehen? Erhalten Sie eine Ausnahme? Wenn ja, was ist die Ausnahme? – Jay

+0

Hi Jai, ich bin mir sicher, dass der Code gut kompiliert. Dies ist eine Konsolenanwendung. – Akhil

Antwort

2

Ihre SKU-Karte ist falsch. Warum haben Sie PRODUCT_NAME als Id-Spalte definiert? Sie müssen es beheben, indem Sie die Id auf eine ID-Spalte Einstellung (die Sie haben kommentiert out):

Id(x => x.Id, "NAME_OF_YOUR_ID_COLUMN_HERE").GeneratedBy.Assigned(); 
Map(x => x.Ptoduct, "PRODUCT_NAME"); 

Wenn PRODUCT_NAME ist in der Tat die Id, müssen Sie es wie folgt festgelegt:

Id(x => x.Ptoduct, "PRODUCT_NAME").GeneratedBy.Assigned(); 

und entfernen Sie die andere Linie:

Map(x => x.Ptoduct, "PRODUCT_NAME"); 

auch wenn Ihre Datenbank hat mehr Felder oder Tabellen dann Mapping Sie sind, kann es Ihnen viele Fehler geben. Um sie zu beheben, müssen Sie in Ihrer Konfiguration use_proxy_validator auf false setzen.

EDIT:
NHibernate erfordert eine ID-Spalte richtig zu arbeiten. Ich weiß es nicht einmal, wenn es funktioniert, ohne dass tatsächlich eine Spalte als Id-Spalte deklariert ist. Selbst wenn Sie Ptoduct als eine ID-Spalte deklarieren, können Sie die Datenbank nicht ordnungsgemäß abfragen, da die Abfrage nach allen Objekten mit demselben Ptoduct das oberste Objekt zurückgibt.

+0

Hi Yogesh, ich habe ID zum Produkt gemappt, weil Tabelle keine ID - Spalte enthält (dh Identitätsspalte oder kann Autoinkrement - Spalte sagen) und nach meinem Kenntnisstand macht das das für (id Spalte in meinem Objekt) auf der Ablauf zur Laufzeit durch Bereitstellung der Primärschlüsselspalte .. bin ich richtig .. ??? Dankeschön – Akhil