ActiveRecord и NHibernate Spatial - PullRequest
1 голос
/ 02 июля 2011

У меня проблемы с ActiveRecord.

Ну, все работает нормально, но иногда работает. НЕ ВСЕ время.

Когда я пытаюсь перейти на страницу MVC, на которую ссылаются в проекте, который содержит пространственную сущность (есть только одна пространственная сущность - и эта сущность не имеет пространственного типа), я получаю это исключение.

{"Столбец GeometryType был объявлен, но не настроен пространственный диалект"}

Существует правильно настроенный диалект. Я попытался настроить его двумя способами: Xml и InPlace.

Это мой метод запуска:

    public static void StartActiveRecord()
    {
        IDictionary<string,string> hash = new Dictionary<string,string>();

        hash.Add("isWeb", "true");
        hash.Add("connection.driver_class","NHibernate.Driver.NpgsqlDriver");
        hash.Add("connection.connection_string","Server=localhost;Port=5432;database=nhiber;User ID=postgres;Password=pass;");
hash.Add("connection.provider","NHibernate.Connection.DriverConnectionProvider");
            hash.Add("dialect","NHibernate.Spatial.Dialect.PostGisDialect,NHibernate.Spatial.PostGis");
            hash.Add("proxyfactory.factory_class","NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle");

        InPlaceConfigurationSource source = new InPlaceConfigurationSource();
        source.Add(typeof(ActiveRecordBase), hash);
        ActiveRecordStarter.Initialize(source, GetActiveRecordTypes());

        foreach (Configuration cfg in ActiveRecordMediator.GetSessionFactoryHolder().GetAllConfigurations())
        {
            cfg.AddAuxiliaryDatabaseObject(new SpatialAuxiliaryDatabaseObject(cfg));
            //Metadata.AddMapping(cfg, MetadataClass.GeometryColumn);
            //Metadata.AddMapping(cfg, MetadataClass.SpatialReferenceSystem);
        }
    }

А это мой метод запуска, в Global.asax

    protected void Application_Start()
    {
        Ignition.StartActiveRecord();

        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);
    }

Эта ошибка иногда возникает. Уничтожение сервера dev иногда делает это нормально, но через несколько шагов происходит сбой.

HELP!

РЕДАКТИРОВАТЬ: я добавляю сопоставления для этой и некоторой другой информации

При наличии диалекта эти ошибки выводятся в Ignition.StartActiveRecord () на Global.asax. Когда нет диалекта, он выдает ошибки в ActiveRecordStarter.Initialize ();

Просто чтобы убедиться, что этот объект, отображенный ниже, является ЕДИНСТВЕННЫМ пространственно-ориентированным объектом во всей сборке.

public class Complaint:ActiveRecordBase<Complaint>
{

[PrimaryKey(Column="complaint_id",Generator=PrimaryKeyType.Sequence,SequenceName="complaint_seq")]
        public virtual int ComplaintId { get; set; }

        [Property(Column="date_of_complaint",NotNull=true)]
        public virtual DateTime DateOfComplaint { get; set; }

        [Property(Column="description",Length=256,NotNull=true)]
        public virtual string Description { get; set; }

        [Property(Column="complaint_status",NotNull=true,Default="1")]
        public cityzenComplaintStatus Status { get; set; }

        [BelongsTo(Column = "complaint_type_id")]
        public ComplaintType Type { get; set; }

        [Property("the_geom", ColumnType = "NHibernate.Spatial.Type.GeometryType, NHibernate.Spatial")]
        public virtual IGeometry Geometry { get; set; }

        [OneToOne(ForeignKey="official_answer_id")]
        public virtual OfficialAnswer CityAnswer { get; set; }

        [BelongsTo("user_id", Fetch = FetchEnum.Select, Lazy = FetchWhen.OnInvoke, Update = false, NotNull = true)]
        public virtual CityzenUser User { get; set; }

        [HasMany(typeof(Vote),Table="vote",ColumnKey="complaint_id",RelationType=RelationType.Set,Inverse=true)]
        public virtual IList<Vote> Votes { get; set; }

        [HasMany(typeof(Comment),Table="comment",ColumnKey="complaint_id",RelationType=RelationType.Set,Inverse=true)]
        public virtual IList<Comment> Comments { get; set; }

        [Property(Column = "deleted", Default = "false", NotNull = true)]
        public virtual bool Deleted { get; set; }
}

Ответы [ 2 ]

1 голос
/ 08 июля 2011

Ваша конфигурация выглядит правильно для меня, но по любой причине, когда NH создает экземпляр GeometryType, он не может найти диалект, который вы настроили для использования, чтобы он знал, какой тип IGeometry вам нужно инициализировать (PostGisGeometryType в вашем случае).

Что вы можете сделать для временного обходного пути, это объявить переменную-член следующим образом:

[Property("the_geom", ColumnType = "NHibernate.Spatial.Type.PostGisGeometryType, NHibernate.Spatial.PostGis")]
public virtual IGeometry Geometry { get; set; }

Если я найду что-нибудь еще, я отправлю сюда сюда.

0 голосов
/ 11 июля 2011

это правильно?hash.Add ( "говор", "NHibernate.Spatial.Dialect.PostGisDialect, NHibernate.Spatial.PostGis * * тысяча два");не должно быть так: hash.Add ("диалект", "NHibernate.Spatial.Dialect.PostGisDialect, NHibernate.Spatial ");

?

takeвзглянуть на: http://nhibernate.info/doc/spatial/configuration-and-mapping.html

...