2

私は誰かが以前にこの問題に遭遇し、私を助けることができることを望んでいます。私のデータベースでは、テーブル間の関係を使用しています

Ex:Authors,Author Books,Booksstore(salesDetails)
**Authors table**
=================
Aid int (Identity and Primarykey),AuthorName varchar(50)
=================

***********
**Author Books table**
=================
BookID int(primary key),BookName nvarchar(50),Aid int (foreign key Authorstable(Aid))
=================

**************
**Booksstore table**
================
StoreID int(primary key),Totalsales int,BookID int (foreign key Author Bookstable(BookID))
================ 

I'm using Nhibernate and mapping above tables in the following
*********************
**Authorsdao.hdm.xml**
*********************
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Dal" namespace="Dal">
  <class name="AurthosDao,Dal" table="Aurthors Table" lazy="true">
    <id name="AId" column="AuthorID" type="int">
      <generator class="native" />
    </id>
    <property type="string" not-null="true" length="250" name="Authorname" column="AuthorName" />
    </class>
</hibernate-mapping>

*********************
**Authorbooksdao.hdm.xml**
*********************
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Dal" namespace="Dal">
  <class name="AurthorBooksDao,Dal" table="AuthorBookstable" lazy="true">
    <id name="AId" column="AuthorID">
      <generator class="foreign">
        <param name="property">AId</param>
      </generator>
    </id>
    <property type="int" not-null="true" name="BookId" column="BookID" />
    <property type="string" not-null="true" name="Bookname" column="BookName" />
    </class>
</hibernate-mapping>


*********************
**Booksstoredao.hdm.xml**
*********************
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Dal" namespace="Dal">
  <class name="BookStoreDao,Dal" table="Bookstoretable" lazy="true">
    <id name="BookId" column="BookID">
      <generator class="foreign">
        <param name="property">BookId</param>
      </generator>
    </id>
    <property type="int" not-null="true" name="StoreId" column="StoreID" />
    <property type="int" not-null="true" name="Totalsales" column="TotalSales" />
   </class>
</hibernate-mapping>

***************************
Now I have to insert the data from Asp.Net Nhibernate in to 3 tables in one transaction.



1)I'm inserting first in Authors table after that I'm trying to get that last inserting key from Authors table and pushing into Authorsbook table

2)Autthorsbooksテーブルに挿入した後、AuthorsBookテーブルから最後に挿入されたBookIDを取得しようとし、BookStoreテーブルにプッシュします。

何か助けがあれば、それは理解できるでしょう。

Radmin次のパブリックIAuthorsAurthorsdata(PlanningManagerProxyプロキシ、文字列authorName、IBookブック、Ilist、IList属性)でトランザクションを使用しています{AuthorDao dao = new AuthorDao();

        using (ITransaction tx = proxy.MarcomManager.GetTransaction())
        {

            // Business logic of AuthorObjective


            dao.Name = authorName;

            tx.PersistenceManager.PlanningRepository.Save<AuthorDao>(dao);
            tx.Commit();

            AuthorDao  objList;
            using (ITransaction txGet = proxy.GetTransaction())
            {


                objList = txGet.PersistenceManager.PlanningRepository.Get<AuthorDao>(id);
                txGet.Commit();

            }
            var objId = from a in objList where a.AuthorID == authorId select a;

            using (ITransaction tx2 = proxy.MarcomManager.GetTransaction())
            {
                AuthorbooksDao objdao = new AuthorbooksDao();
                objdao.BookId = books.BookID;
                objdao.BookName=books.BookName;
                objdao.AuthorId= objId.AuthorId;
                tx2.PersistenceManager.PlanningRepository.Save<AuthorbooksDao>(objdao);
                tx2.Commit();

            }
            }
    }    

@Radim最初にAuthorsのトランザクションをコミットし、次にAuthorDao(AuthorsTable)から最後に挿入されたレコードを取得してから、Bookstoreテーブルにプッシュします。しかし、マッピング時に外部キーが挿入を許可していませんか?

4

1 に答える 1

0

このマッピングを試してみましょう (テーブル宣言を定数として)。

C# クラス:

  public class Author 
  {
     public virtual int ID { get; set; }
     public virtual string Authorname { get; set; }
  }

  public class Book
  {
     public virtual int ID { get; set; }
     public virtual Author Author { get; set; }
     public virtual string Bookname { get; set; }
  }

  public class BookStore
  {
     public virtual int ID { get; set; }
     public virtual Book Book { get; set; }
  }

XML マッピング:

<class name="Author" table="Authors" lazy="true">
    <id name="ID" column="Aid" type="int">
      <generator class="native" />
    </id>

    <property type="string" not-null="true" length="250" name="Authorname" column="AuthorName" />
  </class>

  <class name="Book" table="AuthorBooks" lazy="true">
    <id name="ID" column="BookID">
      <generator class="native" />
    </id>

    <!-- reference Author -->
    <many-to-one name="Author" column="AID" cascade="all" />

    <property type="string" not-null="true" name="Bookname" column="BookName" />
    </class>

  <class name="BookStore" table="Bookstore" lazy="true">
    <id name="ID" column="StoreID">
      <generator class="native" />
    </id>

    <!-- reference Book -->
    <many-to-one name="Book" column="BookID" cascade="all" />

    <property type="int" not-null="true" name="Totalsales" column="TotalSales" />
  </class>

そして、著者、本、店のアイテムを作成する方法のコード - そしてそれらすべてを永続化します:

  // instances creation
  var author = new Author { Authorname = "my author" };
  var book = new Book { Bookname = "my book "};
  var store = new BookStore { TotalSales = 1 };

  // references
  book.Author = author;
  store.Book = book;

  // cascade all will store them all with correct ID
  session.Save(author);

注: あなたのスニペットには誤りがほとんどないため、唯一の方法は緑色のフィールドに例を示すことです。たとえば、ファイルの名前は ...hbm.xml (...hdm.xml ではなく、AuthorsDao ではなく AurthosDao など) にする必要があります。

于 2013-01-10T08:01:51.060 に答える