PetaPoco是否支持组件映射?新手求教实现方法
嘿,刚从NHibernate转用PetaPoco是吧?我来给你捋捋组件映射的事儿~
首先明确说:PetaPoco本身没有像NHibernate那样专门的“组件映射”术语,但它提供了两种常用方式来实现类似嵌套对象映射的需求,分两种场景给你讲:
1. 把嵌套对象作为主表的字段扩展(对应NHibernate的Component)
如果你的EventLocation不需要单独建表,只是作为Event的一组属性集合(比如Event表中有Location_Name、Location_Street这类列),那可以用PetaPoco的ComplexMapping特性来实现:
修改你的代码如下:
[ExplicitColumns] public class Event { [Column] public int Id { get; set; } [Column] public DateTime Start { get; set; } [Column] public DateTime End { get; set; } // 帮你修正了重复的Start字段,应该是End吧😉 // 用[ComplexMapping]标记这个嵌套对象 [ComplexMapping] public EventLocation Location { get; set; } } [ExplicitColumns] public class EventLocation { // 因为是组件,不需要单独的Id(除非你的主表有对应列),可以去掉或者指定对应列名 // [Column("Location_Id")] // public int Id { get; set; } [Column("Location_Name")] public string Name { get; set; } [Column("Location_Street")] public string Street { get; set; } // 其他属性都按这种方式指定主表中的对应列名 }
这样配置后,当你查询Event时,PetaPoco会自动把Location_Name、Location_Street等列的值填充到Event.Location对象的对应属性里,完全符合NHibernate组件映射的用法。
2. 嵌套对象是独立实体(有单独表,关联查询)
如果EventLocation是一个独立的表,和Event通过外键关联(比如Event表有LocationId列关联到EventLocation的Id),那可以用PetaPoco的Reference特性,或者手动写关联查询:
方式一:用[Reference]属性
[ExplicitColumns] public class Event { [Column] public int Id { get; set; } [Column] public DateTime Start { get; set; } [Column] public DateTime End { get; set; } // 外键列 [Column] public int LocationId { get; set; } // 标记关联关系:指定关联的实体类型、外键列、关联实体的主键 [Reference(ReferenceType = typeof(EventLocation), ColumnName = "LocationId", ReferenceMemberName = "Id")] public EventLocation Location { get; set; } } [ExplicitColumns] public class EventLocation { [Column] public int Id { get; set; } [Column] public string Name { get; set; } [Column] public string Street { get; set; } }
查询的时候,你可以用Fetch方法来加载关联数据:
var events = db.Fetch<Event, EventLocation>("SELECT * FROM Event JOIN EventLocation ON Event.LocationId = EventLocation.Id");
方式二:手动映射多结果
如果需要更灵活的查询,也可以手动写JOIN语句,然后通过PetaPoco的多结果映射来赋值:
var events = db.Query<Event, EventLocation, Event>( (eventObj, locationObj) => { eventObj.Location = locationObj; return eventObj; }, "SELECT * FROM Event e INNER JOIN EventLocation el ON e.LocationId = el.Id" );
这样就能把关联的EventLocation数据正确映射到Event的Location属性里啦~
内容的提问来源于stack exchange,提问作者Tobias
相关产品推荐
相关产品推荐

