将多对多转换为父子关系

问题描述 投票:0回答:1

我有两个类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实体

c# fluent-nhibernate
1个回答
0
投票

我终于设法解决了这个问题....实际上我的代码有几个问题:

  1. “带有Count = 2的此SqlParameterCollection的索引2无效”的问题。是由UserAppointmentsMap引起的。将属性定义为组合键的一部分后,不应将其再次映射为引用。 public class UserAppointmentsMap : ClassMap<UserAppointment> { public UserAppointmentsMap() { CompositeId() .KeyReference(a => a.Appointment, "FkAppointmentsId") .KeyReference(u => u.User, "FkUserId"); Table("UserAppointments"); } }
  2. 具有外键的复合ID应使用KeyReference而不是KeyProperty完成
  3. 我遇到了错误生成查询的问题(外键错误,而不是FkAppointmentsId它正在寻找Appointments_Id)所以我必须明确指定列名 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"); } }
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.