我有一个不接受空值的数据库,并且每个字段都有一个默认值。使用流畅的nHibernate,如果我有一个组件有一些但没有填写所有属性,我在插入时会出现错误。我只是想知道如何将DynamicInsert标志降低到组件级别。也许现在已经很晚了,但我会把它放在这里,看看它在哪里。
映射:
public ClientMap()
{
Table("Clients");
DynamicInsert();
DynamicUpdate();
CompositeId()
.KeyProperty(x => x.Accountnumber, "acct_no")
.KeyProperty(x => x.Transferaccount, "tr_acct_no");
Component(c => c.Address,
m =>{
m.Map(x => x.Streetaddress, "coaddress").Not.Nullable().Default("");
m.Map(x => x.City, "cocity").Not.Nullable().Default("");
m.Map(x => x.Postalcode, "costate").Not.Nullable().Default("");
m.Map(x => x.State, "cozip").Not.Nullable().Default(""); });
}
试验:
Client nw = new Client{ Address = new Address{Streetaddress = "my address"},Accountnumber = "6543219",Transferaccount = "1"};
IRepository repo2 = new Repository(session);
repo2.Save(nw);
错误:
无法插入:[BusinessObjects.Client#BusinessObjects.Client] [SQL:INSERT INTO客户端(coaddress,cocity,cozip,costate,acct_no,tr_acct_no)VALUES(?,?,?,?,?,?)]
答案 0 :(得分:3)
我不确定,但我认为你指定的'NotNullable'和'Default'映射属性只有影响/才会在你使用NHibernate映射创建数据库模式时使用,并且它们有对NHibernate将在您的数据库中插入的内容没有实际影响。
如果你想要一些属性的默认值,我认为你应该在具有这个属性的类的构造函数中自己赋予该属性默认值。
答案 1 :(得分:1)
刚遇到类似的问题。 数据库有一个默认约束:
CREATE TABLE MyTable
(
...
InsertDate datetime not null default getdate()
...
)
对象属性:
public DateTime? InsertDate{get;set;}
在我正在做的映射中:
Map(x => x.InsertDate).Column("InsertDate").Not.Nullable().Default("getdate()");
但我改为:
Map(x => x.InsertDate).Column("InsertDate").Generated.Insert();
如果属性为null,则不插入属性
答案 2 :(得分:0)
NHibernate本身不支持组件映射上的动态插入 - 它不是Fluent中缺少的东西。
建议你在Address上放一个默认构造函数,将这些默认属性值设置为空字符串而不是空字符串?
答案 3 :(得分:0)
NHibernate认为组件是单井...组件:-) 这意味着它不会为组件执行动态插入。