Sql server 如何告诉Fluent hibernate外键的名称?

Sql server 如何告诉Fluent hibernate外键的名称?,sql-server,nhibernate,fluent-nhibernate,Sql Server,Nhibernate,Fluent Nhibernate,我有类似的东西 public class AppointmentReminder { public virtual int ReminderId { get; private set; } public virtual CalendarAppointment CalendarAppointment { get; set; } } public class CalendarAppointment { public

我有类似的东西

 public class AppointmentReminder
    {
        public virtual int ReminderId { get; private set; }
        public virtual CalendarAppointment CalendarAppointment { get; set; }
    }



   public class CalendarAppointment
    {
        public virtual int AppointmentId { get; private set; }
        public virtual IList<AppointmentReminder> AppointmentReminders { get; set; }


        public CalendarAppointment()
        {
            AppointmentReminders = new List<AppointmentReminder>();
        }
    }

   public class AppointmentReminderMap : ClassMap<AppointmentReminder>
    {
        public AppointmentReminderMap()
        {
            Table("AppointmentReminders");
            Id(x => x.ReminderId);
            References(x => x.CalendarAppointment).ForeignKey("AppointmentId").Column("AppointmentId").Not.Nullable();
        }
    }

  public class CalendarAppointmentMap : ClassMap<CalendarAppointment>
    {
        public CalendarAppointmentMap()
        {
            Table("CalendarAppointments");
            Id(x => x.AppointmentId);
            HasMany(x => x.AppointmentReminders);
        }
    }
它正在查找CalendarAppointmentId。我不知道为什么它会重复两次。所以我让fluent nhibernate生成我的数据库来查看发生了什么。当我查看AppointmentRequirement表时,它有一个CalendarAppointId的fk

为什么它不使用我指定的名称

这是我的配置

   public ISessionFactory GetSessionFactory()
        {
           ISessionFactory fluentConfiguration = Fluently.Configure()
                                                  .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("ConnectionString")))
                                                  .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Framework.Data.Mapping.MyMap>().Conventions.Add(ForeignKey.EndsWith("Id")))
                                                  //.ExposeConfiguration(BuidSchema)
                                                  .BuildSessionFactory();

            return fluentConfiguration;
        }

        private static void BuidSchema(NHibernate.Cfg.Configuration config)
        {
            new NHibernate.Tool.hbm2ddl.SchemaExport(config).Create(false, true);
        }
public ISessionFactory GetSessionFactory()
{
ISessionFactory fluentConfiguration=Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(c=>c.fromConnectionString WithKey(“ConnectionString”))
.Mappings(m=>m.FluentMappings.AddFromAssemblyOf().Conventions.Add(ForeignKey.EndsWith(“Id”))
//.ExposeConfiguration(内置模式)
.BuildSessionFactory();
返回流配置;
}
私有静态void BuidSchema(NHibernate.Cfg.Configuration配置)
{
新建NHibernate.Tool.hbm2ddl.SchemaExport(config.Create)(false,true);
}

ForeignKey是fk约束的名称,而不是列。您可能需要确保
HasMany
使用相同的列名…“AppointmentId”。您使用的约定是将其默认设置为CalendarAppointId,这与您在一对多方面指定的内容冲突。因此..另一种选择是删除一对多上的
列(“AppointmentId”)
,让约定完成它的任务。

试试:

HasMany(x => x.AppointmentReminders).KeyColumn("AppointmentId");

是的,我本来就是这么做的,但没用。然后我尝试了.Column(),然后我添加了.ForeignKey(),看看两者是否都可以工作,而我通常都会忘记。我通常也忘了按预期做标记。因此,每个月或每两个月,当我有空闲时间时,我都会坐下来浏览我的帖子,放弃投票和接受答案。如果我在引用一个上与.Column()合作,这似乎是可行的。是的,必须在两端都完成,这迫使我编写一个helper对象,因此不需要指定.KeyColumn和.Column。但是我的助手对象不适用于不同项目中的实体和映射,但是,编写该助手对象让我对Fluent NHibernate的工作原理有了很多了解:-)还有另一个尝试:
HasMany(x => x.AppointmentReminders).KeyColumn("AppointmentId");