0

У меня возникла проблема, когда я пытаюсь сохранить экземпляр с помощью NHibernate в приложении WPF + C#.Не удается сохранить экземпляр с помощью NHibernate

Отладка, показанная на этапе session.Save(MyInstance); Вы можете увидеть полный метод ниже. Ошибка:

Необработанное исключение типа 'NHibernate.Exceptions.GenericADOException' произошло в NHibernate.dll Дополнительная информация: не может вставить: [Blog.Models.Province] [SQL: INSERT INTO [ Провинция] (CodProv, NomeProv, Regiao) ЦЕННОСТИ (?,?,?); выберите SCOPE_IDENTITY()]

private void txt_Click(object sender, RoutedEventArgs e) 
{ 
    using(ISession session = NHibernateHelper.AbreSession())   
    { 
     Province province = new Province(); 

      province.CodProv = "11"; 
      province.NomeProv = "Maputo Cidade"; 
      province.Regiao = "Sul";     

     ITransaction tx = session.BeginTransaction(); 
     session.Save(province); 
     tx.Commit(); 
    } 

NHibernateHelper Класс

public class NHibernateHelper 
{ 
    private static ISessionFactory factory = CriaSessionFactory(); 

    private static ISessionFactory CriaSessionFactory() 
    { 
     Configuration cfg = new Configuration(); 
     cfg.Configure(); 
     ISessionFactory factory = Fluently.Configure(cfg) 
      .Mappings(x => 
      { 
       x.FluentMappings.AddFromAssembly(
        Assembly.GetExecutingAssembly()); 
      }).BuildSessionFactory(); 

     return factory; 
    } 

    public static ISession AbreSession() 
    { 
     return factory.OpenSession(); 
    }  
} 

Кто-то может мне помочь?

Вот мои Областные и картографирования классы

public class Province 
{ 
    public virtual int Id { get; set; } 
    public virtual string CodProv { get; set; } 
    public virtual string NomeProv { get; set; } 
    public virtual string Regiao { get; set; } 
} 

Mapping класс

public class ProvinceMapping : ClassMap<Province> 
{ 
    public ProvinceMapping() 
    { 
      Id(province => province.Id).GeneratedBy.Identity(); 
      Map(province => province.CodProv); 
      Map(province => province.NomeProv); 
      Map(province => province.Regiao);    
    }    
} 

В случае необходимости, вот мой стол провинции сценарий.

CREATE TABLE Provincia(
ID INT IDENTITY(1,1) PRIMARY KEY, 
codProv VARCHAR(2) NOT NULL, 
nomeProv VARCHAR(25) NOT NULL, 
regiao VARCHAR(10)); 
+0

Вы должны показать свое отображение, но в этом случае было бы почти наверняка «недостающее IDENTITY» на DB Colun Province_ID ... А также важно: ** наблюдать остальные, за исключением ... следующая строка, безусловно, содержит ясный ответ ** –

+0

@ RadimKöhler. Он использует автоматические сопоставления. @ Elmodai, потому что отображение является неявным, не могли бы вы также добавить код для класса «Провинция»? – Aphelion

+0

@MauriceStam это не о картографии. Я бы поспорил, что столбец БД «Провинция_ID» - таблица «Провинция», как ожидается, будет ИДЕНТИЧНОСТЬ ... но я бы сказал, что это не так. Во всяком случае, именно этот ответ находится в исключении ... только следующая строка;) –

ответ

0

НА ОСНОВЕ КАРТ

связанной с уточненной вопрос, есть одна несогласованность в отображении, проверьте:

  • [SQL: INSERT INTO[Province](
  • CREATE TABLEProvincia(

Так что, если нет опечатки в вопросе, проблема ясна, Там нет таблицы провинция ... просто Provincia

ORIGINAL PART

NHibernate Исключение составляет настоящее сокровище, потому что есть все секреты подробно описаны. Ваши исключения, полный трассировки стека, скорее всего, выглядит следующим образом:

// YOUR part 

Необработанное исключение типа «NHibernate.Exceptions.GenericADOException» произошло в NHibernate.dll Дополнительная информация: не может вставить: [Блог. Models.Province] [SQL: INSERT INTO [Province] (CodProv, NomeProv, Regiao) VALUES (?,?,?); выберите SCOPE_IDENTITY()]

// next part - inner exception 

---> System.Data.SqlClient.SqlException: Не удается вставить значение NULL в столбец 'Province_ID', таблица 'Провинция'; столбец не допускает нулей. INSERT терпит неудачу.

Это может быть еще одно внутреннее исключение, но из его описания вы будете теперь ясно.

В случае, что вопрос "column does not allow nulls" это означает, что мы ожидаем:

Id(x => x.Id, "Province_ID") 
    .GeneratedBy.Identity() 
    ... 

пока БД не набор как:

[Province_ID] [int] IDENTITY(1,1) NOT NULL, 

Просто убедитесь, что ваш ID столбец имеет IDENTITY определен, ALTER его иметь ...

+0

Я пытался помочь как можно скорее ... действительно не уверен, что происходит на вашей стороне ... но последняя попытка - изменить драйвер от SqlClientDriver на Sql2008ClientDriver. –

+0

Koler, Я просто решу проблему. Мне нужно создать таблицу вручную на SQL Server, а затем вставить данные с помощью Hibernate. – elmodai

+0

Итак, у нас есть решение;) замечательно видеть это;) Наслаждайтесь NHibernate –

1

Вот моя конфигурация: У меня есть 2 ConnectionString 1.With имя blog2 -> что я использую для подключения к локальной БД (MDF) 2. Название блога -> я использую для подключения SQL Server DB (ПСЭ)

NHibernate работает только подключен к локальная БД!

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

    <configSections> 
    <section name="hibernate-configuration" 
       type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/> 
    </configSections> 

    <startup>  
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 

    <connectionStrings> 

    <add name="blog2" providerName="System.Data.SqlClient" 
    connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\Elmodai\documents\visual studio 2013\Projects\Blog\Blog\DB1.mdf;Integrated Security=True"/> 

    <add name="blog" providerName="System.Data.SqlClient" 
    connectionString="Data Source=ELMODAI-PC;Initial Catalog=VamosVer;Integrated Security=True"/> 

    </connectionStrings> 

    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
     <property name="connection.provider"> 
     NHibernate.Connection.DriverConnectionProvider 
     </property> 

     <property name="dialect"> 
     NHibernate.Dialect.MsSql2012Dialect 
     </property> 

     <property name="connection.driver_class"> 
     NHibernate.Driver.SqlClientDriver 
     </property> 

     <property name="connection.connection_string_name"> 
     blog 
     </property> 

     <property name="show_sql"> 
     ture 
     </property> 

     <property name="format_sql"> 
     ture 
     </property> 

     <property name="hbm2ddl.auto"> 
     update 
     </property> 

    </session-factory> 
    </hibernate-configuration> 

</configuration> 
Смежные вопросы