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");