我正在尝试将一个新的父项&新子项保存到遗留数据库中
我可以很好地获得数据,当我保存数据时,它会同时保存父级和子级。然而,孩子的SillyNameParentId总是0
表的结构我不能改变,所以我必须想办法使这个工作。
下面是生成的SQL
NHibernate:插入SillyNameParent(Description,Active)值(@p0,@p1);选择SCOPE_IDENTITY();@p0 = 'Test‘类型: String (1073741823),@p1 = True Type: Boolean (0) NHibernate:插入SillyChild (SillyNameCategoryId,sillyNameParentid)值(@p0,@p1);选择SCOPE_IDENTITY();@p0 =0 Type: Int32 (0),@p1 =1 Type: Int32 (0)
最终,我希望@p1设置为SillyNameParentId/Parentid
表:
SillyNameParent
Column PK-IsIdentity: ParentId
Column varchar(255): Description
Column bit: Active
SillyChild //I'm a lookup table
Column int IsIdentity: Id
Column int PK: SillyNameParentId
Column int PK: SillyNameCategoryID模型:
public class SillyNameParent: Entity
{
public SillyNameParent()
{
Children= new List<SillyChild>();
}
public virtual string AreaOfConcernDesc { get; set; }
public virtual bool Active { get; set; }
public virtual IList<SillyChild> Children{ get; set; }
}
public class SillyChild: Entity
{
public virtual int SillyNameParentId { get; set; }
public virtual int SillyNameCategoryId{ get; set; }
public virtual SillyNameParent Parent { get; set; }
}地图:
public class SillyNameParentMap : IAutoMappingOverride<SillyNameParent>
{
public void Override(AutoMapping<SillyNameParent> mapping)
{
mapping.Table("SillyNameParent");
mapping.Id(x => x.Id).Column("ParentId").GeneratedBy.Identity();
mapping.Map(x => x.Description).Not.Nullable();
mapping.Map(x => x.Active).Nullable();
mapping.HasMany(x => x.children)
.Cascade.All()
.KeyColumn("SillyNameParentId")
.Not
.LazyLoad();
}
}
public class SillyChildMap: IAutoMappingOverride<SillyChild>
{
public void Override(AutoMapping<SillyChild> mapping)
{
mapping.Table("SillyChild");
mapping.Id(x => x.Id).Column("Id").GeneratedBy.Identity();
mapping.Map(x => x.SillyNameParentId).Not.Nullable();
mapping.Map(x => x.SillyNameCategoryId).Not.Nullable();
mapping.HasOne(x => x.Parent).ForeignKey("SillyNameParentId");
}
}发布于 2013-12-14 01:55:29
这里有个工作..。因为标识是由DB设置的,所以我猜我需要在保存孩子之前先保存父程序。一定有更好的方法,不过,这是我想出的
public T SaveReturnEntity(T entity)
{
try
{
this.Session.Save(entity);
}
catch
{
if (this.Session.IsOpen)
{
this.Session.Close();
}
throw;
}
this.Session.Flush();
return entity;
}
return _sillyParent.SaveReturnEntity(sillyNameParent) != null;
[Test]
public void Save_sillyParent()
{
var sillyService = ServiceMiniMart.CreateSillyParent();
var filter = new sillyQueryFilter();
{
CategoryId = 1
};
var snp= new SillyNameParent
{
Active = true,
Description= "Test"
};
if (sillyService.SaveSillyParent(snp))
{
snp.Category = new List<SillyChild>
{
new SillyChild
{
SillyNameParentId= snp.Id,
SillyNameCategoryId= filter.CategoryId.Value,
Parent = snp
}
};
}
var a = sillyService.SaveSillyParent(snp);
}发布于 2013-12-14 07:21:48
我想说,你快到了。只有映射父/子应该如下所示:
SillyNameParentMap:
public void Override(AutoMapping<SillyNameParent> mapping)
{
...
mapping.HasMany(x => x.Children)
.Cascade.All()
.KeyColumn("SillyNameParentId")
.Inverse() // this is the way how to manage insertions
.Not
.LazyLoad(); SillyChildMap:
public void Override(AutoMapping<SillyChild> mapping)
{
...
mapping.References(x => x.Parent)
.Column("SillyNameParentId");这个映射将以正确的插入结束,只需这样做:
var parent = new SillyNameParent();
parent... // set properties
var child = new SillyChild();
child... // set properties
parent.Children.Add(child); // parent knows about child
child.Parent = parent; // always do set the relation both ways
sillyService.SaveSillyParent(snp)编辑:选择2期
例外情况是双列映射。这是一个插入或更新的问题。但是有了NHibernate,我们可以很容易地解决这个问题:
mapping.Map(x => x.SillyNameParentId)
.Not.Nullable()
.Not.Insert()
.Not.Update();
mapping.References(x => x.Parent)
.Column("SillyNameParentId");现在,我们已经映射了两个属性(引用父属性及其int表示)。只有引用将用于插入、更新。但这两种方法都可以用于选择、筛选和排序.
https://stackoverflow.com/questions/20575891
复制相似问题