Мой пользовательский ForeignKeyConvention приводит к созданию двух внешних ключей вместо одного - PullRequest
0 голосов
/ 27 сентября 2011

Я пытаюсь создать свое собственное соглашение о внешнем ключе, которое назовет 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 вызывается дважды?И почему один из вызовов не предоставляет значение для параметра "свойство"?

1 Ответ

1 голос
/ 28 сентября 2011

Doh. ForeignKeyConvention предоставляет имя для столбца FK. То, что я должен был использовать, - это IHasManyConvention, которую можно использовать для названия самого ограничения FK.

public class OurForeignKeyConstraintNamingConvention : IHasManyConvention
{
    public void Apply(IOneToManyCollectionInstance instance)
    {
        instance.Key.ForeignKey(string.Format("FK_{0}_{1}", instance.Relationship.Class.Name, instance.EntityType.Name));
    }
}
...