Свободный NHibernate - всегда выпадающий стол - PullRequest
2 голосов
/ 27 сентября 2011

Привет, я начинаю изучать свободное владение NHibernate. Я использую этот урок http://www.d80.co.uk/post/2011/02/20/Linq-to-NHibernate-Tutorial.aspx.

Вот мой пример кода:

public class Account
{
    public virtual int Id { get; set; }
    public virtual string Nick { get; set; }
    public virtual string Password { get; set; }
}

public class AccountMap:ClassMap<Account>
{
    public AccountMap()
    {
        Id(x => x.Id);
        Map(x => x.Nick);
        Map(x => x.Password);
    }
}

public class  NHiberanteHelper
{
    private static ISessionFactory _sessionFactory;

    private static ISessionFactory SessionFactory
    {
        get
        {
            if (_sessionFactory == null)
                InitializeSessionFactory();

            return _sessionFactory;
        }
    }

    private  static void InitializeSessionFactory()
    {

        _sessionFactory = Fluently.Configure()

            //NHibernate bude pouzivat ovladace pre MS SQL 2008
            .Database(MsSqlConfiguration.MsSql2008
                          .ConnectionString(
                               @"Server=JAN-MSI\SQLEXPRESS;Database=SimpleNHibernate;Trusted_Connection=True;").ShowSql()
                              )

            //urci NHibernatu kde ma hladat mapovacie subory
            .Mappings(m=>m.FluentMappings.AddFromAssemblyOf<Account>())

            //ak tabs nie su v DB vytvori
            .ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, true))

            //vytvori jeden session pre cely life-time apps
            .BuildSessionFactory();
    }

    public static ISession OpenSession()
    {
        return SessionFactory.OpenSession();
    }
}

class Program
{
    static void Main(string[] args)
    {
        using (var session = NHiberanteHelper.OpenSession())
        {
            using (var trans = session.BeginTransaction())
            {
                var account = new Account
                                  {
                                      Nick = "dfdwf",
                                      Password = "xxx"
                                  };
                session.Save(account);
                trans.Commit();

            }
        }
        Console.ReadKey();
    }
}

Проблема в том, что эта конфигурация Fluent всегда удаляет таблицу в базе данных.

Мне нужно только проверить, не существует ли таблица, поэтому создавайте таблицу не всегда, когда код запускает отбрасывающую таблицу.

1 Ответ

4 голосов
/ 27 сентября 2011

Ваш звонок на new SchemaExport(cfg).Create(true, true) экспортирует конфигурацию в базу данных.Это отбросит и заново создаст его (это не достаточно умно, чтобы разобраться в различиях и просто выполнить их.

Вы можете использовать SchemaUpdate, который вместо этого обновит схему. Вот сообщение в блоге об этом:http://geekswithblogs.net/dotnetnomad/archive/2010/02/22/138094.aspx

Я всегда предпочитаю обновлять таблицы самостоятельно или использовать что-то вроде SQLCompare от Redgate для обновления схемы при сохранении данных.

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