下午全部。我正在尝试为飞行航段数据库创建一个映射,其中在映射树的底部,FlightSegment 引用了一个起点和目的地表,其中包含一个由三个字母代码和一个布尔值组成的复合 ID,用于确定代码是否是城市。
以下是相关的简化类结构:
public class GTIFlightSegment
{
public virtual int ID { get; protected set; }
public virtual GTIOriginAirport Origin { get; set; }
public virtual GTIDestinationAirport Destination { get; set; }
public virtual GTIFlightSegmentGroup Parent { get; set; }
}
public class GTIAirport
{
public virtual string Code { get; set; }
public virtual string Name { get; set; }
public virtual string City { get; set; }
public virtual string CountryCode { get; set; }
public virtual GTIGeoCode GeoCode {get; set; }
public virtual string Terminal { get; set; }
public virtual bool IsCity { get; set; }
public GTIAirport()
{
GeoCode = new GTIGeoCode();
IsCity = false;
}
public override bool Equals(object obj)
{
var other = obj as GTIAirport;
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return this.Code == other.Code && this.IsCity == other.IsCity;
}
public override int GetHashCode()
{
unchecked
{
int hash = GetType().GetHashCode();
hash = (hash * 31) ^ Code.GetHashCode();
hash = (hash * 31) ^ IsCity.GetHashCode();
return hash;
}
}
}
public class GTIOriginAirport : GTIAirport
{
public virtual GTIFlightSegment Parent { get; set; }
public GTIOriginAirport() : base()
{
}
}
public class GTIDestinationAirport : GTIAirport
{
public virtual GTIFlightSegment Parent { get; set; }
public GTIDestinationAirport() : base()
{
}
}
以下是我到目前为止为对象创建的映射:
public class GTIFlightSegmentMap : ClassMap<GTIFlightSegment>
{
public GTIFlightSegmentMap()
{
Id(x => x.ID);
References(x => x.Destination).Columns(new string[] { "DestinationCODE", "DestinationIsCity" }).Cascade.All();
References(x => x.Origin).Columns(new string[] { "OriginCODE", "OriginIsCity"}).Cascade.All();
References(x => x.Parent).Not.Nullable();
}
}
public class GTIAirportMap : ClassMap<GTIAirport>
{
public GTIAirportMap()
{
Table("GTIAirport");
ReadOnly();
CompositeId()
.KeyProperty(x => x.Code, "CODE")
.KeyProperty(x => x.IsCity, "isCity");
Map(x => x.Name).Column("Airport");
Map(x => x.City);
Map(x => x.CountryCode);
Component(x => x.GeoCode, m =>
{
m.Map(x => x.Latitude);
m.Map(x => x.Longitude);
});
}
}
public class GTIOriginAirportMap : SubclassMap<GTIOriginAirport>
{
public GTIOriginAirportMap()
{
KeyColumn("CODE");
KeyColumn("isCity");
HasOne(x => x.Parent).PropertyRef(x => x.Origin);
}
}
public class GTIDestinationAirportMap : SubclassMap<GTIDestinationAirport>
{
public GTIDestinationAirportMap()
{
KeyColumn("CODE");
KeyColumn("isCity");
HasOne(x => x.Parent).PropertyRef(x => x.Origin);
}
}
我试图实现的是,当在系统中创建FlightSegment时,它将在飞行航段表中存储DestinationIsCity/DestinationCode和OriginIsCity/OriginCode,但不会尝试更新GTIAirport参考表视图。但是,当通过查询从数据库中检索对象时,将获取 GTIAirport 引用表中的丰富信息。
或者可能分别在出发机场和始发机场表中显示代码和 IsCity,并带有返回航段的 ID 参考。
无论我尝试什么内涵,我都会碰到某种墙。基本上我让自己有点乱。我已经翻转了机场和航段之间的关系,换成了仅参考。级联,而不是级联。
使用映射时遇到的常见错误:
1) UPDATE 语句与 FOREIGN KEY 约束冲突
2) {"断开的列映射:Destination.id:GilesSabreConnection.Profiling.Model.BookingEngineModel.Model.GTIFlightSegment,类型组件[Code,IsCity]需要2列,但映射了1列"}
3) {"外键 (FK582A9C81E6C3913B:GTIFlightSegment [Destination_id])) 必须与引用的主键具有相同的列数 (GTIDestinationAirport [CODE, isCity])"}
如果需要,流畅的配置是:
return Fluently.Configure().Database(MsSqlConfiguration.MsSql2012.ConnectionString(@"Data Source=Dev2;Initial Catalog=Sandbox;Integrated Security=True")).Mappings(m => m.FluentMappings.AddFromAssemblyOf<Profile>()).ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(true, true)).BuildSessionFactory();
任何帮助从数据库和流利的大师那里为我指出正确的方向将不胜感激。
提前非常感谢。
通过将 GTIAirport 地图设置为只读,我本质上将目的地和起点地图设置为只读,因此无论我如何配置关系,映射都无法工作。
因此,我将通过名为 GTIAiport 的视图访问的详细机场信息的静态参考数据库拆分为两个,因此不再需要复合键中的布尔值。 我现在有了航段映射,只需使用流利的组件类在航段表中记录机场始发地/目的地代码。在 Airport 类本身中,现在有一个函数,可以使用存储的 Airport 代码根据请求从静态参考数据库表中独立获取丰富的数据。
想不出流利的方法。有兴趣知道是否有办法。
public GTIFlightSegmentMap()
{
Id(x => x.ID);
Component(x => x.Destination, m =>
{
m.Map(y => y.Code).Column("DestinationCode");
});
Component(x => x.Origin, m =>
{
m.Map(y => y.Code).Column("OriginCode");
});
;
References(x => x.Parent).Not.Nullable();
}
}