Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过NHibernate 4和会话插入SQL Server数据库。使用代码映射保存_Nhibernate_Nhibernate Mapping_Mapping By Code - Fatal编程技术网

通过NHibernate 4和会话插入SQL Server数据库。使用代码映射保存

通过NHibernate 4和会话插入SQL Server数据库。使用代码映射保存,nhibernate,nhibernate-mapping,mapping-by-code,Nhibernate,Nhibernate Mapping,Mapping By Code,Session.Save()当前遇到问题,未插入记录并产生以下异常: null id in NHModels.Domain.Activity entry (don't flush the Session after an exception occurs) at NHibernate.Event.Default.DefaultFlushEntityEventListener.CheckId(Object obj, IEntityPersister persister, Obje

Session.Save()当前遇到问题,未插入记录并产生以下异常:

        null id in NHModels.Domain.Activity entry (don't flush the Session after an exception occurs)

at NHibernate.Event.Default.DefaultFlushEntityEventListener.CheckId(Object obj, IEntityPersister persister, Object id, EntityMode entityMode)
at NHibernate.Event.Default.DefaultFlushEntityEventListener.GetValues(Object entity, EntityEntry entry, EntityMode entityMode, Boolean mightBeDirty, ISessionImplementor session)
at NHibernate.Event.Default.DefaultFlushEntityEventListener.OnFlushEntity(FlushEntityEvent event)
at NHibernate.Event.Default.AbstractFlushingEventListener.FlushEntities(FlushEvent event)
at NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEvent event)
at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)
at NHibernate.Impl.SessionImpl.Flush()
at NHibernate.Transaction.AdoTransaction.Commit()
at NHUnitOfWork.Dispose() in NHUnitOfWork.cs:line
at DatabaseActivityOperations.<WriteActivity>d__6.MoveNext() in DatabaseActivityOperations.cs:line 240

我认为这与我如何在ActivityMap中映射ID有关,而生成器没有按预期工作。我尝试将其更改为其他几种类型,并得到相同的异常,或者一种表示无法转换为SystemInt32的异常。我还尝试将ID更改为long并指定数据类型,但没有成功。我在这里做错了什么?

在我发布这篇文章几分钟后,我发现问题实际上在于我如何设置日期和时间

new DateTime(1, 1, 1, 0, 55, 55)

它不喜欢“1/1/0001”部分,所以这似乎是造成问题的原因,我只关心计时片。将年份更改为类似2001的年份修复了插入,并且工作正常,消息只是不太具有描述性。

我的困惑主要源于关于空id的异常,这对我来说意味着id属性存在问题,而不是其他未设置的非id属性之一。我发布的答案使插入正确工作,对我来说,它回答了我自己的问题“我在这里似乎做错了什么?”即使它与我发布的大多数其他代码无关。也许你需要使用
SqlDateTime.MinValue
?或者这55个值有什么原因?
public class ActivityMap : ClassMapping<Activity> {

    public ActivityMap() {
        Schema("dbo");
        Lazy(true);
        Id(x => x.ActivityKey, map => { map.Generator(Generators.Identity); });
        Property(x => x.Activityname, map => { map.NotNullable(true); map.Length(50); });
        Property(x => x.Activitydescription, map => { map.NotNullable(true); map.Length(100); });
        Property(x => x.Averageactivitytime, map =>
        {
            map.NotNullable(true);
            map.Type(NHibernateUtil.Time);
        });
        Property(x => x.Averagenumberpeople, map => { map.NotNullable(true); map.Precision(10); });
        Property(x => x.Worktype, map => { map.NotNullable(true); map.Length(50); });
        Property(x => x.Canautocomplete);
        Bag(x => x.Activityschema, colmap =>  { colmap.Key(x => x.Column("ActivityKey")); colmap.Inverse(true); }, map => { map.OneToMany(); }); 
    }
}
public class NHUnitOfWork : IDisposable
{
    public static string ConnectingString { get; private set; } = @"data source=nh;initial catalog=db;MultipleActiveResultSets=True;";
    protected static Configuration _config;
    protected static NHibernate.ISessionFactory _sessionFactory;
    public NHibernate.ISession Session { get; private set; }
    protected NHibernate.ITransaction Transaction { get; set; }
    private const System.Data.IsolationLevel ISOLATION_LEVEL = System.Data.IsolationLevel.ReadUncommitted;
    private bool RollBack { get; set; } = false;

    public NHUnitOfWork(string databaseConnectionString)
    {
        if (_config == null)
        {
            var cfg = new Configuration();
            cfg.DataBaseIntegration(db =>
            {
                db.Driver<NHibernate.Driver.SqlClientDriver>();
                db.ConnectionString = @"data source=nh;initial catalog=db;MultipleActiveResultSets=True;";
                //db.ConnectionString = databaseConnectionString;
                db.Dialect<MsSql2012Dialect>();
                db.BatchSize = 500;
            })
            .AddAssembly(typeof(Activity).Assembly)
            .SessionFactory()
            .GenerateStatistics();

            var mapper = new ModelMapper();
            mapper.AddMappings(typeof(ActivityMap).Assembly.GetTypes());
            cfg.AddMapping(mapper.CompileMappingForAllExplicitlyAddedEntities());
            _config = cfg;
            _sessionFactory = _config.BuildSessionFactory();
        }
        Session = _sessionFactory.OpenSession();
        Transaction = Session.BeginTransaction(ISOLATION_LEVEL);
        RollBack = false;
    }

    public void Commit()
    {
        Transaction.Commit();
    }

    public void Rollback()
    {
        if (Transaction.IsActive) Transaction.Rollback();
    }

    public void Dispose()
    {
        if (RollBack)
        {
            Transaction.Rollback();
        }
        else
        {
            Transaction.Commit();
        }

        Session.Close();
    }
}
    var activity = new Activity
    {
        Activityname = "TestActivity",
        Activitydescription = "This is a test",
        Averagenumberpeople = 1,
        Worktype = "Test",
        Canautocomplete = false,
        Averageactivitytime = new DateTime(1, 1, 1, 0, 55, 55)
    };
    using (var uow = new NHUnitOfWork(NHUnitOfWork.ConnectingString))
    {
        uow.Session.Save(activity); // Produces exception here

        //This also produces an exception
        //uow.Session.Save(activity, Generators.Identity);
    }
new DateTime(1, 1, 1, 0, 55, 55)