gpt4 book ai didi

nhibernate - nhibernate/fluent nhibernate 中的 GeneratedBy 有哪些不同

转载 作者:行者123 更新时间:2023-12-03 23:56:56 25 4
gpt4 key购买 nike

我正在玩 nhibernate 和 fluent nhibernate 并查看 GeneratedBy,有很多可供选择(序列、sequenceIdentity 等),但我不知道它们中的大多数是做什么的。

例如,我看到 3 个 Guid。

GeneratedBy.Guid();
GeneratedBy.GuidComb();
GeneratedBy.GuidNative();

我听说不要使用 Guid() 并使用 GuidComb,因为它是专门为处理数据库而设计的(它不会破坏索引)。

虽然我不知道 GuidNative() 是什么。

我也在努力做

GeneratedBy.Native()

我认为这会使用 MSSQl 2008 使用的任何东西,但我遇到了问题

CREATE TABLE [dbo].[AutoIds](
[Id] [int] NOT NULL,
[Test] [varchar](50) NULL,
CONSTRAINT [PK_AutoIds] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

边做边想

  Id(x => x.Id).GeneratedBy.Native();

nhibernate 会自动为我生成一个 Id(如果我使用 combGuid(),它会这样做)但是当我尝试提交它时,我得到了

NHibernate.Exceptions.GenericADOException was caught
Message=could not insert: [unitofwork.Models.Domain.AutoIds][SQL: INSERT INTO [AutoIds] (Test) VALUES (?); select SCOPE_IDENTITY()]
Source=NHibernate
SqlString=INSERT INTO [AutoIds] (Test) VALUES (?); select SCOPE_IDENTITY()
StackTrace:
at NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL, ISessionImplementor session, IBinder binder)
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[] fields, Boolean[] notNull, SqlCommandInfo sql, Object obj, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[] fields, Object obj, ISessionImplementor session)
at NHibernate.Action.EntityIdentityInsertAction.Execute()
at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.Save(Object obj)
at unitofwork.Models.Repository.StoreRepo.Create(AutoIds autoIds) in StoreRepo.cs:line 37
at unitofwork.Models.Service.StoreService.CreateStore() inStoreService.cs:line 40
InnerException: System.Data.SqlClient.SqlException
Message=Cannot insert the value NULL into column 'Id', table 'TESTUoW.dbo.AutoIds'; column does not allow nulls. INSERT fails.
The statement has been terminated.
Source=.Net SqlClient Data Provider
ErrorCode=-2146232060
Class=16
LineNumber=1
Number=515
Procedure=""
Server=(local)
State=2
StackTrace:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
at NHibernate.Id.IdentityGenerator.InsertSelectDelegate.ExecuteAndExtract(IDbCommand insert, ISessionImplementor session)
at NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL, ISessionImplementor session, IBinder binder)
InnerException:

nhibernate 不能自动递增整数吗?这是不是太难跟踪以至于无法计算出下一个数字?

我只是在玩 id,因为我很震惊地得知我这样做的方式不是一个好方法(我在我的数据库中设置了一个自动递增的 int,这是我一直为 ado.net 所做的和 linq to sql)。

通过这样做,每次保存时都会对数据库进行额外的查询(以获取 pk)。所以我正在尝试看看是什么组合导致了这种情况发生。

我开始更倾向于使用 Guid(尽管我宁愿使用更短的东西,这样如果您出于某种原因必须手动查看数据库,在其他表中进行匹配会更快)。

我一直在考虑 hilo,但我不喜欢的是,如果我不得不切换 ORM,说 Entity Framework 可能不支持 hilo。再加上我听说使用 HiLO,它可以非常快速地处理大量 ID,从而使您需要更大的数据类型。

最佳答案

参见 NHibernate Docs对于各种发电机。 IMO GUID(Comb) 或 HiLo 具有最佳性能,因为可以在应用程序中生成 ID。如果您使用 HiLo,则可以轻松切换到没有该功能的 ORM,只需创建一个带有 value > max(Id) 的序列,并将其用作列的默认值来模拟自动递增。

注意:在我的项目中,我总是成功地使用 HiLo,所以我有偏见。

关于nhibernate - nhibernate/fluent nhibernate 中的 GeneratedBy 有哪些不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7419685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com