我有两个类User和Appointment,曾经以多对多关系链接。但现在我必须能够管理这种关系的状态(我需要能够跟踪用户是否已接受预约或被拒绝或尚未响应)。
这些类映射到各个表Users和Appointments。两个表都通过UserAppointments表连接,该表具有由fk到用户和fk到约会表的复合主键。
当前实现抛出一个异常,并显示以下消息:“此SqlParameterCollection的索引2无效,Count = 2”。当我尝试将新的UserAppointment对象添加到约会对象的集合时
用户映射
public class UserMap : ClassMap<User>
{
public UserMap()
{
Id(d => d.Id);
Map(d => d.FirstName).Column("FirstName");
Map(d => d.LastName).Column("LastName");
Map(d => d.Email).Column("Email");
HasMany(u => u.UserAppointments);
Table("Users");
}
}
约会映射
public class AppointmentMap : ClassMap<Appointment>
{
public AppointmentMap()
{
Id(c => c.Id);
HasMany(a => a.AppointmentParticipants).Inverse().Cascade.All();
References(a => a.Location).Column("FkAddressId");
Map(a => a.DateAndTime).Column("AppointmentDate").CustomType<UtcDateTimeType>();
Map(a => a.Description).Column("AppointmentDescription");
Map(a => a.Status).Column("AppointmentStatus").CustomType<AppointmentStatus>();
HasMany(a => a.AppointmentEstates).Inverse().Cascade.All();
Table("Appointments");
}
UserAppointments映射
public class UserAppointmentsMap : ClassMap<UserAppointment>
{
public UserAppointmentsMap()
{
CompositeId()
.KeyReference(a => a.Appointment, "FkAppointmentsId")
.KeyReference(u => u.User, "FkUserId");
References(a => a.User).Column("FkUserId");
References(a => a.Appointment).Column("FkAppointmentsId");
Table("UserAppointments");
}
}
预期的结果是当我将新的UserAppointment添加到现有约会的集合时,要在UserAppointments表中创建的新记录指向相关的User和Appointment实体
我终于设法解决了这个问题....实际上我的代码有几个问题:
public class UserAppointmentsMap : ClassMap<UserAppointment>
{
public UserAppointmentsMap()
{
CompositeId()
.KeyReference(a => a.Appointment, "FkAppointmentsId")
.KeyReference(u => u.User, "FkUserId");
Table("UserAppointments");
}
}
public class AppointmentMap : ClassMap<Appointment>
{
public AppointmentMap()
{
Id(c => c.Id);
HasMany(a => a.AppointmentParticipants).Inverse().KeyColumn("FkAppointmentsId").Cascade.All();
References(a => a.Location).Column("FkAddressId");
Map(a => a.DateAndTime).Column("AppointmentDate").CustomType<UtcDateTimeType>();
Map(a => a.Description).Column("AppointmentDescription");
Map(a => a.Status).Column("AppointmentStatus").CustomType<AppointmentStatus>();
HasMany(a => a.AppointmentEstates).Inverse().KeyColumn("FkAppointmentsId").Cascade.All();
Table("Appointments");
}
}