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)插入到 AuthorsBooks 表后,尝试从 AuthorsBook 表中获取最后插入的 BookID 并推入 BookStore 表。

如果有任何帮助将不胜感激..

Radmin 我在以下公共 IAuthors Aurthorsdata(PlanningManagerProxy proxy, String authorName,IBook books ,Ilist , IList attributes) { 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,AurthosDao 而不是 AuthorsDao 等。

于 2013-01-10T08:01:51.060 回答