使用NHibernate基于外键在子表中插入行

时间:2013-01-10 06:57:44

标签: asp.net nhibernate nhibernate-mapping

我希望有人之前遇到过这个问题并且可以帮助我。在我的数据库中我使用表之间的关系

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我在以下公共IAuthors Aurthorsdata(PlanningManagerProxy代理,String authorName,IBook书籍,Ilist,IList属性)中使用transcation         {             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表。但是在映射时间时外键不允许插入?

1 个答案:

答案 0 :(得分: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 mapping:

<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等。