使用JetDriver通过NHibernate插入FoxPro表时关闭自动空值是行不通的

时间:2009-12-09 20:42:03

标签: nhibernate fluent-nhibernate null oledb foxpro

我正在使用NHibernate与Burrow和Fluent将数据从SQLServer2005传送到一个充满FoxPro 7 dbf的目录。

当我尝试通过Burrow的GenericDAO保存新记录时,我得到一个异常,归结为“字段XXX不接受空值”,其中字段XXX是一个NOT NULL字段,根本没有映射,因为它是不重要的,是空白。

我直接使用ADO.Net& OleDbConnection的,发现在连接字符串中添加“; NULL = OFF”解决了问题。

我在连接字符串中尝试了“NULL = OFF”,“NULL = NO”以及“VFPOLEDB”&提供商的“VFPOLEDB.1”。它仍然试图自动将NULL插入“INSERT(field1,field2,...)VALUES(?,?,?...)”语句中缺少的字段(即我没有映射的那些字段)。

有什么想法吗?

这是我对FoxPro表的流畅配置:

string connString = "Provider=VFPOLEDB.1;Data Source="
  + @"D:\Documents\Work\Projects\OurProjects\Clients\Client1\Testing\Data"
  + ";NULL=NO;";

Fluently.Configure(nhCfg)
  .Database(JetDriverConfiguration.Standard.ConnectionString(connString)
  .Dialect<GenericDialect>().Driver<OleDbDriver>())
  .Mappings(m => m.FluentMappings.AddFromAssembly(
    Assembly.Load("OurProduct.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")))
  .BuildConfiguration();

映射类,这些插入的实际表有几十个未映射的字段,都是NOT NULL,它们在新记录中都应该是空白的:

    public class ClientMap : ClassMap<Client>
    {
        public ClientMap() {
            Id(x => x.PersonId).GeneratedBy.Assigned();
            Map(x => x.LastName).Length(15);
            Map(x => x.FirstName).Length(15);
            Map(x => x.MiddleName).Column("midname").Length(1);
            Map(x => x.Address1).Length(40);
            Map(x => x.Address2).Length(40);
            Map(x => x.City).Length(20);
            Map(x => x.State).Length(2);
            Map(x => x.ZipCode).Length(9);
            Map(x => x.Gender).Length(30);
            Map(x => x.Ethnicity).Length(30);
            Map(x => x.MaritalStatus).Column("marital").Length(30);
            Map(x => x.LivingArrangement).Column("livarrange").Length(30);
            Map(x => x.PovertyLevel).Column("povlevel").Length(30);
            Map(x => x.BirthDate);
            Map(x => x.AssessmentNotes).Column("assnotes");
        }
    }

2 个答案:

答案 0 :(得分:1)

执行以下操作似乎可以解决此问题,但我认为需要为每个新工作单元(BurrowFramework初始化)执行此操作。

        var sess = bf.GetSession(typeof(Client));

        var dbCmd = sess.Connection.CreateCommand();

        dbCmd.CommandType = System.Data.CommandType.Text;
        dbCmd.CommandText = "SET NULL OFF";

        sess.Transaction.Enlist(dbCmd);


        dbCmd.ExecuteNonQuery();

答案 1 :(得分:0)

OLE-DB属性DBPROP_VFPOLEDB_NULL等效于SET NULL。