изменить имя ограничения в изменении автоматического сопоставления fluentNhibernate - PullRequest
1 голос
/ 09 октября 2010

я использую оракул с FluentNHibernate с автоматическим изменением и NHibernate проблема в том, как указать имя ограничения путем переопределения модели отображения ??

сгенерированный sql так:

alter table FirstTable
    add constraint FK_VerLongIdentifierLongerThan30Characther
    foreign key (FirstTableID) 
    references SecondTable;

мне нужно изменить "FK_VerLongIdentifierLongerThan30Characther" на меньший идентификатор, переопределив модель отображения следующим образом:

model.Override<SomeClass>(m =>
    {
        m.HasOne<SomeOtherClass>(c => c.SomeProperty).?????????;
        //or
        m.????????
    }
  )

1 Ответ

4 голосов
/ 10 октября 2010

Вместо того чтобы делать переопределение для каждого класса с этой проблемой, я создал соглашение об отображении , которое будет обрезать объекты с превосходящей 30-символьную схему именования для внешних ключи, имеет много и много ко многим отношениям:

<Ч />
public class OracleIHasManyConvention : IHasManyConvention
{
    public void Apply(IOneToManyCollectionInstance instance)
    {
        var keyName = string.Format(CultureInfo.InvariantCulture, "FK_{0}_{1}",
                                    instance.Member.Name,
                                    instance.EntityType.Name).Truncate(30);

        instance.Key.ForeignKey(keyName);
    }
}
<Ч />
public class OracleForeignKeyConvention : FluentNHibernate.Conventions.ForeignKeyConvention
{
    protected override string GetKeyName(Member property, System.Type type)
    {
        var name = property == null
                   ? "Id_" + type.Name.ToUnderscoredNaming()
                   : "Id_" + property.Name.ToUnderscoredNaming();

        return name.Truncate(30);
    }
}
<Ч />

Тогда я бы назвал эти условные обозначения так:

var cfg = Fluently.Configure()
                .Database(SQLiteConfiguration.Standard.UsingFile("foobar.lite3"))
                .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Product>()
                                                      .Where(a => a.Namespace == typeof (Product).Namespace)
                                                      .Conventions.Add<OracleIHasManyConvention>()
                                                      .Conventions.Add<OracleForeignKeyConvention>()
                                                      .Conventions.Add<OracleGeneralConvention>()
                                                      .Conventions.Add<CascadeAllConvention>()
                                   ));

<ч /> Вот расширение Truncate:

public static class StringHelper
{
    public static string Truncate(this string text, int endIndex)
    {
        if (text.Length > endIndex)
        {
            text = text.Substring(0, endIndex).TrimEnd('_');
        }
        return text;
    }
}

Надеюсь, это пригодится в любом случае. :)

...