Вопрос по nhibernate, fluent-nhibernate, sql-server, c# – Что такое schemaExport в Fluent NHibernate?

4

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

        /// 
        /// Sets up NHibernate, and adds an ISessionFactory to the given
        /// container.
        /// 
        private void ConfigureNHibernate(IKernel container)
        {
            // Build the NHibernate ISessionFactory object
            var sessionFactory = FluentNHibernate
                .Cfg.Fluently.Configure()
                .Database(
                    MsSqlConfiguration.MsSql2008.ConnectionString(
                        c => c.FromConnectionStringWithKey("ServicesDb")))
                .CurrentSessionContext("web")
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf())
                //.ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(true, true))
                .ExposeConfiguration(cfg =>
                                         {
                                             var schemaExport = new SchemaExport(cfg);
                                             schemaExport.Drop(true, true);
                                             schemaExport.Create(true, true);
                                         })
                .BuildSessionFactory();

            // Add the ISessionFactory instance to the container
            container.Bind().ToConstant(sessionFactory);

            // Configure a resolver method to be used for creating ISession objects
            container.Bind().ToMethod(CreateSession);

            container.Bind().To();
        }

Теперь я знаю, что делает большинство из них, но мне больше интересно узнать больше об этом разделе;

.ExposeConfiguration(cfg =>
                          {
                              var schemaExport = new SchemaExport(cfg);
                              schemaExport.Drop(true, true);
                              schemaExport.Create(true, true);
                           })

В идеале я ожидаюschemaExport.Drop(true, true); отбросить схему базы данных иschemaExport.Create(true, true); воссоздать его. СейчасSchemaExport оСхемы базы данных как мы это знаем? Я спрашиваю об этом, потому что, когда я запускаю свое приложение с упомянутыми конфигурациями, я получаю ошибку:

There is already an object named 'AllUsers' in the database. вschemaExport.Create(true, true);

AllUsers является одним из представлений базы данных, которые у меня есть как часть схемы

Добавление ответа на запрос

Чтобы исправить ошибку, я добавилSchemaAction.None(); в UserMap, как показано ниже.

public class UserMap : VersionedClassMap
{
    public UserMap()
    {
        Table("AllUsers"); //This is the database view which was causing the error
        SchemaAction.None(); // This was added to fix the porblem

        Id(x => x.UserId).CustomType();            
        Map(x => x.Firstname).Not.Nullable();
        Map(x => x.Lastname).Not.Nullable();            
        Map(x => x.Email).Nullable();
        Map(x => x.Username).Not.Nullable();
    }
}
Я думаю, что я получал ... вы могли бы попробовать более простой подход (чтобы убедиться, что он работает) ....... вместо связанных команд ........ просто для теста. granadaCoder
@granadaCoder Ответ в этом посте - то, что я показал здесь, не так ли?я не работаю Тем не мение,SchemaUpdate работает просто отлично. Но я слышал, это не очень хорошая практика.SchemaUpdate Komengem
Можете ли вы добавить (внизу) (вашего оригинального сообщения), чтобы получить полный ответ ...... Я 'Мне это когда-нибудь понадобится. Благодарю. granadaCoder
@granadaCoder Не уверен, что вы хотели бы, чтобы я добавил в исходное сообщение. Отмеченный ответ плюс комментарии кажутся самоочевидными относительно того, где необходимо внести изменения. Однако, если вы вернетесь к этому и каким-то образом будете нуждаться в дополнительной помощи, вы можете просто спросить в комментарии, и я буду рад помочь. Komengem

Ваш Ответ

1   ответ
4

Ошибка говорит о том, что Schemaexport пытается создать AllUsers два раза, скорее всего потому, что для создания представления существует объект AuxiliaryDatabase, а для его использования - Entity Mapping. ЗадаватьSchemaAction.None() в сопоставлении AllUsers.

Также:

.ExposeConfiguration(cfg =>
                      {
                          var schemaExport = new SchemaExport(cfg);
                          schemaExport.Drop(true, true);
                          schemaExport.Create(true, true);
                       })

можно сократить до

.ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, true))

потому что Create всегда отбрасывает перед созданием, он будет дублировать отбрасывание, как оно есть.

Все работает сейчас, спасибо. Я использую более длинный вариант, потому что он более читабелен, разве вы не считаете, что более короткая версия более эффективна? Komengem
даAllUsers mapping == UserMap Firo
AllUsers представляет собой представление базы данных, которое представляет собой сценарий SQL, я могут пуSchemaAction.None() там. Но у меня также есть UserMap, возможно, вы имели в виду это? Komengem
более короткая версия более эффективна, но не намного, потому что она несбросить схему 2 раза, но один раз Firo

Похожие вопросы