Я пытаюсь создать свое собственное соглашение о внешнем ключе, которое назовет FK в формате " FK_SourceTable_TargetTable ".
Однако, когда я запускаю его, я получаю two внешние ключи вместо одного.
Мое соглашение о внешних ключах выглядит следующим образом:
public class OurForeignKeyConvention : ForeignKeyConvention
{
protected override string GetKeyName(Member property, Type type)
{
if (property == null)
return string.Format("FK_{0}Id", type.Name); // many-to-many, one-to-many, join
if (property.Name == type.Name)
return string.Format("FK_{0}_{1}", property.DeclaringType.Name, type.Name);
return string.Format("FK_{0}_{1}_{2}", property.DeclaringType.Name, property.Name, type.Name);
}
}
Мой код для его применения:
[TestMethod]
public void ShouldBeAbleToBuildSchemaWithOurConventions()
{
var configuration = new Configuration();
configuration.Configure();
Fluently
.Configure(configuration)
.Mappings(m => m.FluentMappings
.AddFromAssemblyOf<Widget>()
.Conventions.Add<OurForeignKeyConvention>()
)
.BuildSessionFactory();
new SchemaExport(configuration).Create(false, true);
}
Мои классы и сопоставления:
public class Widget
{
public virtual int Id { get; set; }
public virtual string Description { get; set; }
public virtual WidgetType Type { get; set; }
public virtual ISet<WidgetFeature> Features { get; set; }
}
public class WidgetFeature
{
public virtual int Id { get; set; }
public virtual Widget Widget { get; set; }
public virtual string FeatureDescription { get; set; }
}
public class WidgetMap : ClassMap<Widget>
{
public WidgetMap()
{
Id(w => w.Id);
Map(w => w.Description);
HasMany(w => w.Features).Cascade.AllDeleteOrphan().Inverse();
}
}
public class WidgetFeatureMap : ClassMap<WidgetFeature>
{
public WidgetFeatureMap()
{
Id(w => w.Id);
Map(w => w.FeatureDescription);
References(w => w.Widget);
}
}
Конечным результатом являются два внешних ключа, один из которых называется тем, что я хочу - FK_WidgetFeature_Widget - и другой называется FK_WidgetId .
Если я изменю OurForeignKeyConvention, чтобы всегда возвращатьодно и то же имя, независимо от того, является ли параметр «свойство» нулевым, тогда я правильно получаю один FK - но тогда я не могу получить часть « SourceTable » моего имени FK.
Может кто-нибудьобъясните, что я тут делаю не так?Почему GetKeyName вызывается дважды?И почему один из вызовов не предоставляет значение для параметра "свойство"?