2013-12-14 21 views
5

どのようにしてCreateQuery()でテーブルにデータを挿入できますか?この例ではテーブルへのNHibernateの挿入

C#クラス

namespace NHibernateTutorial 
{ 
    public class Customer 
    { 
     public virtual int CustomerId { get; set; } 
     public virtual string FirstName { get; set; } 
     public virtual string LastName { get; set; }   
    } 
} 

マッピングXML

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="NHibernateTutorial" 
       namespace="NHibernateTutorial"> 
    <class name="Customer"> 
    <cache usage="read-write"/> 
    <id name="CustomerId"> 
     <generator class="native" /> 
    </id> 
    <property name="FirstName" /> 
    <property name="LastName" />  
    </class> 
</hibernate-mapping> 

私のプログラムのクラス

var configuartion = new Configuration(); 
       configuartion.DataBaseIntegration(x => 
        { 
         x.ConnectionString = @"Data Source=NH;Initial Catalog=NHibernate;Integrated Security=False;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False"; 
         x.Driver<SqlClientDriver>(); 
         x.Dialect<MsSql2012Dialect>(); 
         x.LogFormattedSql = true; 
         x.LogSqlInConsole = true; 
         x.AutoCommentSql = true; 
        }); 

       configuartion.AddAssembly(Assembly.GetExecutingAssembly()); 

       var sessionFactory = configuartion.BuildSessionFactory(); 
       using (var session = sessionFactory.OpenSession()) 
       { 
       var query = session.CreateQuery("INSERT INTO Customer (FirstName, LastName) select i.FirstName, i.LastName from CustomerOld i"); 
       query.ExecuteUpdate(); 
       } 

どのように、私は別のテーブルから行をコピーし、しかし、私は新しい行を作成する必要があります私がすることができます?

答えて

5

答えは以下のとおりです。これはサポートされていません。 13.3. DML-style operationsをチェックし、エキス:

INSERT文の疑似構文は次のとおりです。INSERT INTOエンティティ名 プロパティリストリストselect。注意すべき点:

  • INSERT INTO ... SELECT ...フォームのみがサポートされています。 INSERT INTO ... VALUES ...フォームではありません。
    ...
  • select_statementには、任意の有効なHQLクエリーが
    を選択することができます...

DMLの背後にある考え方は、DB側で直接操作を行うことです。挿入のためには、値がそこになければなりません(どこかに)。

var customer = new Customer(); 
customer.FirstName ... 
session.Save(customer); 

正しいアプローチだと、あなたは

は興味深い読書だろ必要なものを行います:NHibernate – Executable DML

しかし、そこは、あなたのケースのためソリューションは、標準的な方法を使用しています

関連する問題