我有一个遗留数据库,我使用NHibernate进行映射.关注的对象是帐户和通知对象列表.对象看起来像:
public class Notification
{
public virtual int Id { get; set; }
public virtual DateTime BatchDate { get; set; }
/* other properties */
public virtual Account Account { get; set; }
}
public class Account
{
public virtual int Id { get; set; }
public virtual string AccountNumber { get; set; }
/* other properties */
}
Run Code Online (Sandbox Code Playgroud)
映射文件如下所示:
<class name="Account" table="Account" dynamic-update="true">
<id name="Id" column="AccountID">
<generator class="native" />
</id>
<property name="AccountNumber" length="15" not-null="true" />
<!-- other properties --> …Run Code Online (Sandbox Code Playgroud) 我的visual studio解决方案包括Web应用程序和单元测试应用程序.我的Web应用程序使用log4net.我希望能够从命令行使用msbuild来构建我的解决方案.但是,每当我从命令行构建解决方案时,我都会遇到构建错误,因为它无法将log4net.xml复制到测试项目的bin目录中.
错误消息是:
"无法将文件'\ bin\log4net.xml'复制到'bin\Debug\log4net.xml'.拒绝访问路径'\ bin\log4net.xml'."
看起来Visual Studio正在锁定此文件,但我无法弄清楚它为什么需要.有没有办法阻止VS在已加载的项目中锁定XML文档文件?
我试图通过从不同的命名空间向不同的端点发送消息来配置我的NServiceBus配置中的消息端点映射.
因此,我在web.config中配置了以下内容:
<MessageEndpointMappings>
<add Messages="Company.Messages.Accounts" Endpoint="ServiceInput" />
<add Messages="Company.Messages.Payments" Endpoint="ServiceInput" />
<add Messages="Company.Messages.Cancellations" Endpoint="ServiceInput" />
<add Messages="Company.Messages.Notifications" Endpoint="ServiceInput" />
</MessageEndpointMappings>
Run Code Online (Sandbox Code Playgroud)
但是,当我的应用程序启动时,我收到以下异常:
Spring.Objects.PropertyAccessExceptionsException:PropertyAccessExceptionsException(1个错误); 嵌套的PropertyAccessExceptions是:[Spring.Core.TypeMismatchException:无法将类型[System.Collections.Hashtable]的属性值转换为属性'MessageOwners'所需的类型[System.Collections.IDictionary].,内部异常:System.ArgumentException:问题加载消息程序集:Company.Messages.Payments ---> System.IO.FileNotFoundException:无法加载文件或程序集"Company.Messages.Payments"或其依赖项之一.该系统找不到指定的文件.文件名称:'Company.Messages.Payments'
我觉得有趣的是它似乎找到了Company.Messages.Accounts但在第二个配置的行上失败了.我想也许它不喜欢让它们全部转到同一个端点,但更改此配置以使它们进入不同的端点并没有改变我收到的错误消息.
我究竟做错了什么?是不是可以通过命名空间来分割消息(我所见过的只是按类型和汇编)?
谢谢,史蒂夫
我有一个现有的数据库,里面有表Transactions.我添加了一个名为TransactionSequence的新表,其中每个事务最终只有一个记录.我们使用序列表来计算给定帐户的交易.我已将其映射为一对一映射,其中TransactionSequence具有TransactionId的主键.
约束是事务表上有一个而不是触发器,不允许更新已取消或已发布的事务.
因此,当计算序列并保存事务时,NHibernate会尝试发送事务更新,如'UPDATE Transaction SET TransactionId =?WHERE TransactionId =?'.但由于触发因此失败.如何配置我的映射,以便在插入新的TransactionSequence表时NHibernate不会尝试更新Transaction表?
交易映射:
<class name="Transaction" table="Transaction" dynamic-update="true" select-before-update="true">
<id name="Id" column="ID">
<generator class="native" />
</id>
<property name="TransactionTypeId" access="field.camelcase-underscore" />
<property name="TransactionStatusId" column="DebitDebitStatus" access="field.camelcase-underscore" />
<one-to-one name="Sequence" class="TransactionSequence" fetch="join"
lazy="false" constrained="false">
</one-to-one>
</class>
Run Code Online (Sandbox Code Playgroud)
和序列映射:
<class name="TransactionSequence" table="TransactionSequence" dynamic-update="true">
<id name="TransactionId" column="TransactionID" type="Int32">
<generator class="foreign">
<param name="property">Transaction</param>
</generator>
</id>
<version name="Version" column="Version" unsaved-value="-1" access="field.camelcase-underscore" />
<property name="SequenceNumber" not-null="true" />
<one-to-one name="Transaction"
class="Transaction"
constrained="true"
foreign-key="fk_Transaction_Sequence" />
</class>
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激...
我正在将NHibernate实现到现有的Web应用程序中.但是,我们还有一些其他进程可以在数据库上进行批量插入和更新.如何让NHibernate意识到后端数据库中发生的更改是通过NHibernate启动的?
我在asp.net中使用的NHibernate中读到的大部分信息都提到将Session对象存储在HttpContext或CallContext中.然后,这将在应用程序生命周期的持续时间内存储会话对象.这是我实施的.我担心在每个请求上初始化NHibernate的成本.在每个请求上初始化Session对象时,这种方法是否没有显着的性能损失?
另外,将SessionFactory存储在HttpContext或CallContext中是否更有意义,以便不必在每个请求上重新生成映射?
我有一个实体映射在NHibernate中,并使用SQL时间戳列作为版本号进行乐观并发控制.映射如下:
<class name="Entity" optimistic-lock="version" discriminator-value="0">
<id name="id">
<generator class="native" />
</id>
<version name="Version" column="Version" generated="always" unsaved-value="null" type="System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
...
<subclass name="ChildEntity" discriminator-value="1" />
</class>
Run Code Online (Sandbox Code Playgroud)
我正在测试当数据库中的一行中的数据在记录的获取和更新之间发生变化时会发生什么.为此,我正在直接针对表中正在由NHibernate更新的记录之一运行更新语句.此直接更新会更改表中记录的版本号.
正如所料,NHibernate托管更新不会发生在特定行上(这很好).但是,在提交期间不会抛出异常.我预计在提交事务时会发生StaleObjectStateException,以便我可以回滚事务并通知用户.这不是预期的行为吗?我错过了什么吗?
我提交事务的代码看起来像这样:
_session.BeginTransaction();
...
// load objects in session
IList<ChildEntity> toChange = _session.Find('some condition');
foreach ( var itemToChange in toChange )
{
itemToChange.Status = Status.Updated;
}
...
_session.Transaction.Commit();
Run Code Online (Sandbox Code Playgroud)
这些项目属于同一会话,所有工作都在一个事务中完成.ChildEntity是Entity基类的子类,它将optimistic-lock设置为version.
nhibernate ×4
asp.net ×1
caching ×1
concurrency ×1
icriteria ×1
lazy-loading ×1
locking ×1
messaging ×1
msbuild ×1
msmq ×1
nservicebus ×1
one-to-one ×1
versioning ×1