2012-01-25 36 views
0

我正在處理非常基本的NHibernate 3.2任務,將記錄插入到現有的Postgres表中。我正在使用非常簡單的對象,以便它們對此問題有意義。使用NHibernate 3.2(loquacious)和bycode映射在postgres中插入記錄

Postgres的表如下所示:

CREATE TABLE cat 
(
    id serial NOT NULL, 
    "name" character varying(50) NOT NULL, 
    sex_id integer NOT NULL, 
    CONSTRAINT cat_pkey PRIMARY KEY (id), 
    CONSTRAINT cat_sex_id_fkey FOREIGN KEY (sex_id) 
     REFERENCES sex (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
) 
WITH (
    OIDS=FALSE 
); 

CREATE TABLE sex 
(
    id serial NOT NULL, 
    "name" character varying(10) NOT NULL, 
    CONSTRAINT sex_pkey PRIMARY KEY (id), 
    CONSTRAINT sex_name_key UNIQUE (name) 
) 
WITH (
    OIDS=FALSE 
); 

我的映射類如下:

public class CatMap : ClassMapping<Cat> 
    { 
     public CatMap() 
     { 
      Table("cat"); 
      Id(x => x.Id, map => 
      { 
       map.Column("id"); 
       map.Generator(NHibernate.Mapping.ByCode.Generators.Native); 
      }); 
      Property(x => x.Name, map => 
      { 
       map.Column("name"); 
       map.Length(50); 
       map.NotNullable(true); 
      }); 

      ManyToOne(x => x.Sex, map => 
      { 
       map.Column("Sex"); 
       map.Unique(true); 
       map.ForeignKey("cat_sex_id_fkey"); 
      }); 
     } 
    } 

public class SexMap : ClassMapping<Sex> 
    { 
     public SexMap() 
     { 
      Table("sex"); 
      Id(x => x.Id, map => 
       { 
        map.Column("id"); 
        map.Generator(Generators.Native); 
       }); 
      Property(x => x.Name, map => 
       { 
        map.Column("name"); 
        map.Unique(true); 
        map.Length(10); 
        map.NotNullable(true); 
       }); 
     } 
    } 

我的數據類如下所示:

public class Sex 
{ 
    public Sex() 
    { 
    } 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
} 

public class Cat 
{ 
    public Cat() 
    { 
    } 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual Sex Sex { get; set; } 
} 

最後,類包含我實際嘗試使用上述所有內容的代碼。

public class Class1 
    { 
     public string DoSomething() 
     { 
      var sessionFactory = CreateSessionFactory(); 

      using (var session = sessionFactory.OpenSession()) 
      { 
       using (var transaction = session.BeginTransaction()) 
       { 
        Postgres.Tables.Sex sex1 = new Postgres.Tables.Sex() { Name = "Male" }; 
        Postgres.Tables.Sex sex2 = new Postgres.Tables.Sex() { Name = "Female" }; 

        Postgres.Tables.Cat cat1 = new Postgres.Tables.Cat() { Name = "Cat1" }; 
        cat1.Sex = sex1; 
        Postgres.Tables.Cat cat2 = new Postgres.Tables.Cat() { Name = "Cat2" }; 
        cat2.Sex = sex2; 

        session.SaveOrUpdate(sex1); 
        session.SaveOrUpdate(sex2); 
        session.SaveOrUpdate(cat1); 
        session.SaveOrUpdate(cat2); 

        transaction.Commit(); 
       } 
      } 

      return "I created the cats."; 
     } 

     private static ISessionFactory CreateSessionFactory() 
     { 
      NHibernate.Mapping.ByCode.ModelMapper modelMapper = new NHibernate.Mapping.ByCode.ModelMapper(); 
      System.Type[] mappingTypes = typeof(Postgres.Tables.Mappings.CatMap).Assembly.GetExportedTypes().Where(t => t.Name.EndsWith("Map")).ToArray(); 
      modelMapper.AddMappings(mappingTypes); 
      Configuration cfg = new Configuration(); 
      cfg.Proxy(p => p.ProxyFactoryFactory<NHibernate.Bytecode.DefaultProxyFactoryFactory>()); 
      cfg.DataBaseIntegration(d => 
       { 
        d.ConnectionString = "server=192.168.1.126;Port=5432;Database=simple;User Id=postgres;Password=postgres;"; 
        d.Dialect<NHibernate.Dialect.PostgreSQL82Dialect>(); 
       }); 
      cfg.AddMapping(modelMapper.CompileMappingForAllExplicitlyAddedEntities()); 
      return cfg.BuildSessionFactory(); 
     } 
    } 

我收到在GenericADOException 「session.SaveOrUpdate(CAT1)」 消息「無法插入:[DAL.Postgres.Tables.Cat] [SQL:INSERT INTO貓(姓名,性別)VALUES( ?,?);選擇lastval()]「。 InnerException是「{」錯誤:42703:關係\「貓\」的列「sex \」不存在「}」。

對於如何正確地將「sex1」分配給「cat1」和「sex2」爲「cat2」,我有點難住,因此第一個是男性,第二個是女性。

謝謝你的任何意見。

回答

1

m.Column(「Sex」)顧名思義就是指定列名稱而不是您指定的屬性名稱。所以你應該寫m.Column(「sex_id」)。當NH從您的映射創建數據庫模式時,NH使用map.ForeignKey(「cat_sex_id_fkey」)作爲FK名稱。

+0

非常感謝你的激情。你的答案解決了這個問題,我已經測試確認。適當的信用給出。 – Lucas

相關問題