2013-06-25 2 views
1

Как указано в заголовке, как родительский, так и дочерний объект вставляются в базу данных, но не связаны.NHibernate Cascade не устанавливает внешний ключ

Mapping Запрос

<class name="Request" table="Requests"> 
<id name="RequestId"> 
    <generator class="native" /> 
</id> 
<many-to-one name="BulkReport" class="BulkReport" column="BulkId" cascade="none" lazy="proxy" /> 
<property name="RunNumber" /> 
<property name="MobileNumber" /> 
<property name="Message" /> 
<property name="RequestedOn" /> 
<property name="Closed" /> 

<many-to-one name="Communication" class="Communication" column="CommId" cascade="save-update" lazy="proxy" /> 
<many-to-one name="Outcome" class="Outcome" column="OutcomeId" cascade="none" lazy="proxy" /> 
<many-to-one name="Discount" class="Discount" column="Discount" not-found="ignore" cascade="save-update" lazy="proxy" /> 
</class> 

Mapping Скидка

<class name="Discount" table="Discounts" discriminator-value="BASE"> 
<id name="DiscountId"> 
    <generator class="native" /> 
</id> 

<discriminator column="DiscountType" not-null="true" /> 

<property name="MobileNumber" /> 
<property name="CustomerName" /> 
<property name="AddedOn" /> 
<property name="Status" /> 
<property name="Pending" /> 
<many-to-one name="Product" class="DiscountProduct" column="DiscountProduct" cascade="none" lazy="proxy" /> 
<many-to-one name="AddedBy" class="User" cascade="none" lazy="proxy" /> 

<subclass name="StaffDiscount" discriminator-value="STAFF"> 
    <many-to-one name="Employee" class="Employee" column="EmployeeNumber" cascade="none" lazy="proxy" not-null="false" /> 
</subclass> 
</class> 

SQL Из теста

NHibernate: INSERT INTO Discounts (MobileNumber, CustomerName, AddedOn, Status,   Pending, DiscountProduct, AddedBy, DiscountType) VALUES (?, ?, ?, ?, ?, ?, ?, 'BASE');@p0 = 700000000, @p1 = 'Test', @p2 = 25/06/2013 14:38:43, @p3 = True, @p4 = False, @p5 = 1, @p6 = 'Test' 
NHibernate: select @@identity 
NHibernate: INSERT INTO Requests (BulkId, RunNumber, MobileNumber, Message, RequestedOn, Closed, CommId, OutcomeId, Discount) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);@p0 = 1, @p1 = 100, @p2 = 700000000, @p3 = 'Test Request', @p4 = 25/06/2013 14:38:43, @p5 = True, @p6 = NULL, @p7 = 1, @p8 = 0 
NHibernate: select @@identity 

Любая идея, почему это происходит? получил полный блок на этом?

редактировать: Запрашиваемая информация

Скидка Класс

public class Discount 
{ 
    public virtual int DiscountId { get; set; } 
    public virtual double MobileNumber { get; set; } 
    public virtual string CustomerName { get; set; } 
    public virtual DateTime AddedOn { get; set; } 
    public virtual bool Status { get; set; } 
    public virtual bool Pending { get; set; } 

    public virtual DiscountProduct Product { get; set; } 
    public virtual User AddedBy { get; set; } 

    public override string ToString() 
    { 
     return "0" + MobileNumber + ", " + CustomerName.Trim(); 
    } 
} 

Запрос класса

public class Request 
{ 
    public virtual int RequestId { get; set; } 
    public virtual BulkReport BulkReport { get; set; } 
    public virtual int RunNumber { get; set; } 
    public virtual double MobileNumber { get; set; } 
    public virtual string Message { get; set; } 
    public virtual DateTime RequestedOn { get; set; } 
    public virtual Outcome Outcome { get; set; } 
    public virtual bool Closed { get; set; } 
    public virtual Communication Communication { get; set; } 
    public virtual Discount Discount { get; set; } 
} 

Test I Ran

 [Test] 
    public void Can_add_new_request_with_discount() 
    { 
     ISession session = _sessionFactory.OpenSession(); 

     BulkReport report = session.Get<BulkReport>(1); 
     Outcome outcome = session.Get<Outcome>(1); 
     User user = session.Get<User>("Test"); 
     DiscountProduct discountProduct = session.Get<DiscountProduct>(1); 


     Request request = new Request() 
     { 
      Message = "Test Request", 
      BulkReport = report, 
      Closed = true, 
      MobileNumber = 07000000000, 
      RequestedOn = DateTime.Now, 
      RunNumber = 100, 
      Outcome = outcome 
     }; 

     Discount discount = new Discount 
      { 
       AddedBy = user, 
       AddedOn = DateTime.Now, 
       CustomerName = "Test", 
       MobileNumber = 07000000000, 
       Pending = false, 
       Status = true, 
       Product = discountProduct 
      }; 

     request.Discount = discount; 

     session.Save(request); 

     var fromDbRequest = session.Get<Request>(request.RequestId); 
     var fromDbDiscount = session.Get<Discount>(discount.DiscountId); 

     Assert.IsNotNull(fromDbRequest); 
     Assert.IsNotNull(fromDbDiscount); 
     Assert.AreEqual(request.MobileNumber, fromDbRequest.MobileNumber); 
     Assert.AreEqual(discount.MobileNumber, fromDbDiscount.MobileNumber); 

     session.Close(); 
    } 
+1

'обратное =«истинный»'? – valverij

+0

Не в схеме, которую я использую? какая версия была введена? –

+0

Извините, я просто понял, что он недоступен на 'много-к-одному'. У вас есть свойство Discount.Requests? Если да, то какой тип коллекции? Ссылка со Скидка -> Запрос не отображается выше. – valverij

ответ

1

Этот тест выглядит так. Вы действительно должны использовать транзакции (и звоните transaction.Commit()). В качестве альтернативы позвоните по телефону session.Flush(). Если вы это сделаете, вы, скорее всего, получите инструкцию по обновлению, которая устанавливает Discount в Request.

не связаны с вашей проблемой, но вы должны открыть новый сеанс для получения ваших fromDb объектов, в противном случае запрос не DB не производится, так как они уже находятся в кэше первого уровня дня сессии

+0

Не могу поверить, что я не видел, что все другие тесты были сделаны, как вы сказали. Был слишком сфокусирован на базе данных и картографии, а не на коде. благодаря –