.net core 使用带有NHibernate的web api通过JSON插入嵌套对象

.net core 使用带有NHibernate的web api通过JSON插入嵌套对象,.net-core,nhibernate,asp.net-core-webapi,fluent-nhibernate-mapping,.net Core,Nhibernate,Asp.net Core Webapi,Fluent Nhibernate Mapping,我正在编写一个由ReadAPI和WriteAPI组成的应用程序。ReadAPI包含域类,并首先使用EF核心代码生成SQL DB并从中读取 write API使用NHibernate写入EF Core生成的数据库。到目前为止,我已经通过write API插入了“simple”对象,效果很好 我现在遇到了一个问题。我有一个域类Driver,里面有一个嵌套的对象Address。在DB级别,一个驱动程序可以有一个地址,一个地址可以属于多个驱动程序。我试图通过write API发布一个JSON对象,一个驱

我正在编写一个由ReadAPI和WriteAPI组成的应用程序。ReadAPI包含域类,并首先使用EF核心代码生成SQL DB并从中读取

write API使用NHibernate写入EF Core生成的数据库。到目前为止,我已经通过write API插入了“simple”对象,效果很好

我现在遇到了一个问题。我有一个域类Driver,里面有一个嵌套的对象Address。在DB级别,一个驱动程序可以有一个地址,一个地址可以属于多个驱动程序。我试图通过write API发布一个JSON对象,一个驱动程序对象。到目前为止,我已经解决了通过在DB中预先创建地址记录并在JSON中给出地址ID来插入地址的问题

我现在要做的是提供完整的嵌套JSON对象,并让NHibernate为我生成插入。我尝试了很多东西,但我觉得我一事无成。任何建议都将不胜感激

我将.NETCore与NHiberate 5.3.5一起使用,它已经具备了代码映射功能。如果有人可以用Fluent NH来解决这个问题,那也可以,因为我会自己将它转换成NH5.3.5符号

我的代码:

域类:

司机:

namespace Models
{
    public class Chauffeur : IIdentifiable
    {
        public virtual long Id { get; set; }
        public virtual string Naam { get; set; }
        public virtual string Voornaam { get; set; }
        public virtual DateTime GeboorteDatum { get; set; }
        //todo validatie
        public virtual string RijksRegisterNummer { get; set; }
        public virtual RijbewijsTypes TypeRijbewijs { get; set; }
        public virtual bool Actief { get; set; }

        //rel adres
        public virtual long AdresId { get; set; }
        public virtual Adres Adres { get; set; }

        //rel tankkaart
        public virtual long TankkaartId { get; set; }
        public virtual Tankkaart Tankkaart { get; set; }

    }
}
地址:

namespace Models
{
    public class Adres : IIdentifiable
    {
        public virtual long Id { get; set; }
        public virtual string Straat { get; set; }
        public virtual int Nummer { get; set; }
        public virtual string Stad { get; set; }
        public virtual int Postcode { get; set; }
        public virtual ICollection<Chauffeur> Chauffeurs { get; set; }
    }
}
我将如何在将来插入它:

{
                "Naam" : "Bart",
                "Voornaam" : "Jannsses",
                "Adres" : {
                    "Straat": "Boomstraat", 
                    "Nummer": 1, 
                    "Stad": "Gent", 
                    "Postcode": 9000
                          },
                "GeboorteDatum" : "1979-04-25",
                "RijksRegisterNummer" : "999-888-7777",
                "TypeRijbewijs" : 1,
                "Actief" : true
}
请注意,地址的ID是在DB级别自动生成的

任何帮助都将不胜感激


亲切问候

您需要在
司机地图
课程中添加
多通
地图

 this.ManyToOne(x => x.Adres , m =>
        {
            m.Column("AdresId");
            // AdresId can be insert and update
            m.Update(true);
            m.Insert(true);
            m.Cascade(Cascade.None);
            m.Fetch(FetchKind.Join);
            m.NotFound(NotFoundMode.Exception);
            m.Lazy(LazyRelation.Proxy);
            m.ForeignKey("AdresId");
        });
您还需要为
Adres
AdresMap
添加映射类。我希望你已经有了。如果没有,请按以下方式添加-

public class AdresMap : ClassMapping<Adres> 
{
    public AdresMap()
    {
    this.Table("Adres"); //Your table name
    this.Id(c => c.Id, c =>
        {
            c.Generator(Generators.Native);
            c.Type(NHibernateUtil.Int64);
            c.Column("Id");
            c.UnsavedValue(0);
        });

    Set(x => x.Chauffeurs, c =>
        {
            c.Key(k =>
                {
                    k.Column("Id");
                    k.ForeignKey("AdresId");
                });
            c.Inverse(true);
            c.Cascade(Cascade.None);
        },
        r => r.OneToMany(o => { }));

    this.Property(x => x.Straat );
    // ... other properties
   }
}
公共类地址映射:类映射
{
公共地址
{
this.Table(“Adres”);//您的表名
this.Id(c=>c.Id,c=>
{
c、 生成器(Generators.Native);
c、 类型(NHibernateUtil.Int64);
c、 列(“Id”);
c、 未保存值(0);
});
集合(x=>x.司机,c=>
{
c、 键(k=>
{
k、 列(“Id”);
k、 外国钥匙(“AdresId”);
});
c、 逆(真);
c、 Cascade(Cascade.None);
},
r=>r.OneToMany(o=>{});
this.Property(x=>x.Straat);
//……其他财产
}
}

您能分享数据库插入实际发生的代码吗?这可能有助于提供一些额外的背景。
 this.ManyToOne(x => x.Adres , m =>
        {
            m.Column("AdresId");
            // AdresId can be insert and update
            m.Update(true);
            m.Insert(true);
            m.Cascade(Cascade.None);
            m.Fetch(FetchKind.Join);
            m.NotFound(NotFoundMode.Exception);
            m.Lazy(LazyRelation.Proxy);
            m.ForeignKey("AdresId");
        });
public class AdresMap : ClassMapping<Adres> 
{
    public AdresMap()
    {
    this.Table("Adres"); //Your table name
    this.Id(c => c.Id, c =>
        {
            c.Generator(Generators.Native);
            c.Type(NHibernateUtil.Int64);
            c.Column("Id");
            c.UnsavedValue(0);
        });

    Set(x => x.Chauffeurs, c =>
        {
            c.Key(k =>
                {
                    k.Column("Id");
                    k.ForeignKey("AdresId");
                });
            c.Inverse(true);
            c.Cascade(Cascade.None);
        },
        r => r.OneToMany(o => { }));

    this.Property(x => x.Straat );
    // ... other properties
   }
}