Объекты не сохраняются должным образом в базе данных - PullRequest
1 голос
/ 12 марта 2012
[Test]
public void Artist_gets_stored_properly()
{
    using (ISession session = NHHelper.GetSession())
    {
        Artist artist = new Artist() { Name = "Somathilaka Jayamaha" };

        artist.Songs = new List<Song>()
        {
            new Song(){Artist = artist, Name = "Manamaala girawu"},
            new Song(){Artist = artist, Name = "Sende andura"},
            new Song(){Artist = artist, Name = "Sunilwan nuwan"}
        };

        foreach (var s in artist.Songs)
        {
            session.Save(s);
        }
        session.Save(artist);
    }

    using (ISession session = NHHelper.GetSession())
    {
        Artist artist = session.Query<Artist>().Single(x => x.Name == "Somathilaka Jayamaha");
        Assert.AreEqual(3, artist.Songs.Count);
        Assert.AreEqual("Sende andura", artist.Songs[1].Name);
    }
}

public class Artist
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual IList<Song> Songs { get; set; }
    }

    public class Song
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual string WebPath { get; set; }
        public virtual string FilePath { get; set; }
        public virtual bool Downloaded { get; set; }
        public virtual Artist Artist { get; set; }

        void Download(IDownloader downloader)
        {
        }
    }

У меня есть приведенный выше тестовый пример, и он не работает в этой строке: Assert.AreEqual(3, artist.Songs.Count);.Песни не спасаются, кажется.Я использую автоматическое отображение, и у меня есть Cascade.All() для полей сбора в переопределениях отображения, и у меня отключена отложенная загрузка.Я не могу понять, почему этот тест не проходит.Как видите, я также вручную сохранил 3 песни, хотя, насколько я понимаю, мне не нужно делать это, когда у меня есть поле Cascade.All() для Artist.Songs.Может кто-нибудь сказать мне, что я делаю не так?Благодарю.

MS SQLServer 2005, .NET 3.5, FluentNHibernate 1.2.0.712

1 Ответ

3 голосов
/ 12 марта 2012

Вы не используете транзакцию и никогда не сбрасываете сеанс.

Единственная причина, по которой вы получаете вставки , заключается в том, что вы используете генератор identity, который вставляет при вызове Save (это ограничение, а не функция).

Правильный способ к этому:

using (ISession session = NHHelper.GetSession())
using (var transaction = session.BeginTransaction())
{
    Artist artist = new Artist { Name = "Somathilaka Jayamaha" };

    artist.Songs = new List<Song>()
    {
        new Song{Artist = artist, Name = "Manamaala girawu"},
        new Song{Artist = artist, Name = "Sende andura"},
        new Song{Artist = artist, Name = "Sunilwan nuwan"}
    };

    session.Save(artist);
    transaction.Commit();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...