Беглый NHibernate один ко многим не спасающим детям - PullRequest
0 голосов
/ 14 июля 2011

Я использую Fluent NHibernate. Это классический случай отношения один ко многим. У меня есть один из родителей Supply со многими детьми SupplyAmount.

Родительский объект снабжения сохраняется с правильной информацией, но суммы не вставляются в БД, когда я сохраняю родителя. Что я делаю, чтобы каскад не работал?

Существуют следующие сущности:

public class Supply : BaseEntity
{
    public Guid SupplyId    { get; set; }
    public string LastName      { get; set; }
    public string FirstName     { get; set; }
    public string Comments      { get; set; }
    public virtual IList<SupplyAmount> Amounts { get; set; }

    public Supply()
    {
        Amounts = new List<SupplyAmount>();
    }

    public virtual void AddAmount(SupplyAmount amount)
    {
        amount.Supply = this;
        Amounts.Add(amount);
    }
}


public class SupplyAmount : BaseEntity
{
    public virtual Guid SupplymountId { get; set; }
    public virtual Supply Supply { get; set; }
    public virtual int Amount { get; set; }
}

И отображение следующее:

public class SupplyMap : ClassMap<Supply>
{
    public SupplyMap()
    {
        Id(x => x.SupplyId);
        Map(x => x.LastName);
        Map(x => x.FirstName);  
        Map(x => x.Comments);

        HasMany<SupplyAmount>(x => x.Amounts)
            .Inverse().Cascade.SaveUpdate()
            .KeyColumn("SupplyAmountId")
            .AsBag();
    }
}


public class SupplyAmountMap : ClassMap<SupplyAmount>
{
    public SupplyAmountMap()
    {
        Id(x => x.SupplyAmountId);
        References(x => x.Supply, "SupplyId").Cascade.SaveUpdate();
        Map(x => x.Amount);
    }
}

И вот как я это называю:

    public SaveIt()
    {
        Supply sOrder = Supply();

        sOrder.FirstName = "TestFirst";
        sOrder.LastName = "TestLast";
        sOrder.Comments = "TestComments";

        for (int i = 0; i < 5; i++)
        {
            SupplyAmount amount = new SupplyAmount();
            amount.Amount = 50;
            amount.Supply = sOrder;
            sOrder.AddAmount(amount);
        }

        // This call saves the Supply to the Supply table but none of the Amounts
        // to the SupplyAmount table.
        AddSupplyOrder(sOrder);
    }

1 Ответ

0 голосов
/ 31 марта 2013

Я знаю, что это старый пост, но почему бы и нет ...

// This call saves the Supply to the Supply table but none of the Amounts

Этот комментарий в SaveIt () указывает на то, что вы вызываете сохранение в предложении, а не суммы. В этом случае у вас неправильная логика.

Итак, чтобы это исправить:

SupplyMap -> Инверс не должен быть там для Сумм.

HasMany<SupplyAmount>(x => x.Amounts).Cascade.SaveUpdate();

SupplyAmountMap -> удалить ссылки (x => x.Supply, "SupplyId"). Cascade.SaveUpdate (); Замените его на

References<Supply>(x=>x.Supply);

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

Session.Save(supply);

В вашем тесте после того, как вы организуете поставку и поставку, убедитесь, что вы позвонили Session.Flush () после сохранения, чтобы заставить его войти. Это не так важно в коде, как вы обычно выполняете транзакции перед вызовом объекта предложения.

Ура, Choco

Кроме того, как примечание стороны, обычно не очень хорошая идея, чтобы быть многословным с беглыми отображениями. пусть вещи по умолчанию делают то же самое, поэтому я бы рекомендовал использовать подсказки по именованию столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...