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