首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fluent Nhibernate将child.parentid = parentId保存在新父母和孩子身上

Fluent Nhibernate将child.parentid = parentId保存在新父母和孩子身上
EN

Stack Overflow用户
提问于 2013-12-13 20:59:22
回答 2查看 1.8K关注 0票数 2

我正在尝试将一个新的父项&新子项保存到遗留数据库中

我可以很好地获得数据,当我保存数据时,它会同时保存父级和子级。然而,孩子的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

表:

代码语言:javascript
复制
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

模型:

代码语言:javascript
复制
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; }

}

地图:

代码语言:javascript
复制
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");
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-14 01:55:29

这里有个工作..。因为标识是由DB设置的,所以我猜我需要在保存孩子之前先保存父程序。一定有更好的方法,不过,这是我想出的

代码语言:javascript
复制
 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);
    }
票数 1
EN

Stack Overflow用户

发布于 2013-12-14 07:21:48

我想说,你快到了。只有映射父/子应该如下所示:

SillyNameParentMap:

代码语言:javascript
复制
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:

代码语言:javascript
复制
public void Override(AutoMapping<SillyChild> mapping)
{
    ...
    mapping.References(x => x.Parent)
       .Column("SillyNameParentId");

这个映射将以正确的插入结束,只需这样做:

代码语言:javascript
复制
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,我们可以很容易地解决这个问题:

代码语言:javascript
复制
mapping.Map(x => x.SillyNameParentId)
    .Not.Nullable()
    .Not.Insert()
    .Not.Update();
mapping.References(x => x.Parent)
    .Column("SillyNameParentId");

现在,我们已经映射了两个属性(引用父属性及其int表示)。只有引用将用于插入、更新。但这两种方法都可以用于选择、筛选和排序.

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20575891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档