ActiveRecord和NHibernate Spatial

时间:2011-07-02 03:25:47

标签: nhibernate castle-activerecord

我在使用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);
        }
    }

这是我的Startup方法,在Global.asax

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

        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);
    }

有时会发生此错误。杀死开发服务器有时会让它变好,但只会在几步之后再次崩溃。

HELP!

编辑:我正在添加映射以及其他一些信息

当有方言时,这会在Global.asax上的Ignition.StartActiveRecord()中出错。当没有方言时,它在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 个答案:

答案 0 :(得分:1)

您的配置看起来正确,但无论出于何种原因,只要NH实例化GeometryType实例,它就无法找到您配置使用的方言,以便它知道您需要初始化的IGeometry的类型(在您的情况下为PostGisGeometryType)。 / p>

您可以为临时解决方法做的是声明您的成员变量:

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

如果我发现其他任何内容,我会在此发回。

答案 1 :(得分:0)

这是对的吗? hash.Add( “方言”, “NHibernate.Spatial.Dialect.PostGisDialect,的 NHibernate.Spatial.PostGis ”); 不应该是这样的: hash.Add( “方言”, “NHibernate.Spatial.Dialect.PostGisDialect,的 NHibernate.Spatial ”);

看一眼:http://nhibernate.info/doc/spatial/configuration-and-mapping.html