.net core 使用带有NHibernate的web 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符号 我的代码: 域类: 司机:.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对象,一个驱
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
}
}