Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как изменить название foreign key constraint в EF / 11 сообщений из 11, страница 1 из 1
21.07.2015, 13:30
    #39012246
RomaMarusyk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить название foreign key constraint в EF
Использую EF и code first подход.
Так как у нас есть собственая конвенция по именования объектов, то мне нужно изменить название автогенерируемых foreign key. Стандартно он выглядит так: FK_dbo.City_dbo.CityType_City_CityTypeId но для решения задачи нужно привести его к названию: City_FKC_CityType.

Я нашел подобный вопрос , который говорит, что можно изменить имя ограничений вручную. Тем не менее, это меня не устраивает, так как у меня есть много таблиц и ограничений внешних ключей.

Также я нашел некоторую информацию о "Custom Code First Conventions"
Нужен ваш совет могу ли я изменить имя ограничения, используя Custom Code First Conventions, или есть какие-либо другие методы реализации?

Конечно есть другой вариант это скачать исходный код EF, внести изменения и пользоваться, но это в крайнем случае.

Такая же проблема с именованием первичного ключа.
Зарание спасибо.
...
Рейтинг: 0 / 0
21.07.2015, 13:49
    #39012285
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить название foreign key constraint в EF
RomaMarusykТакже я нашел некоторую информацию о "Custom Code First Conventions"
Нужен ваш совет могу ли я изменить имя ограничения, используя Custom Code First Conventions, или есть какие-либо другие методы реализации?

Можешь, делай именно с помощью конвенций, ничего другого не надо!
...
Рейтинг: 0 / 0
21.07.2015, 13:49
    #39012287
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить название foreign key constraint в EF
RomaMarusykТакая же проблема с именованием первичного ключа.
Зарание спасибо.

Конвенции -- сила! Раз затянешься, потом не оторваться
...
Рейтинг: 0 / 0
21.07.2015, 13:50
    #39012288
RomaMarusyk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить название foreign key constraint в EF
у серьезно, как мне переименовать ключ?
...
Рейтинг: 0 / 0
21.07.2015, 13:52
    #39012292
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить название foreign key constraint в EF
RomaMarusykу серьезно, как мне переименовать ключ?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
class CustomKeyConvention : Convention
{
    public CustomKeyConvention()
    {
        Properties()
            .Where(prop => prop.Name.EndsWith("Key"))
            .Configure(config => config.IsKey());
    }
}
...
Рейтинг: 0 / 0
21.07.2015, 14:32
    #39012359
RomaMarusyk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить название foreign key constraint в EF
я видел пример как изменить название колонки для FK, но не знаю можно ли поменять название самого ключа с помощью Конвенции. Помогите пожалуйста, более конкретно так как я слабо розбирюся в этом. Спасибо
...
Рейтинг: 0 / 0
21.07.2015, 19:12
    #39012677
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить название foreign key constraint в EF
RomaMarusykя видел пример как изменить название колонки для FK, но не знаю можно ли поменять название самого ключа с помощью Конвенции. Помогите пожалуйста, более конкретно так как я слабо розбирюся в этом. Спасибо

Я не понял что такое «поменять название самого ключа». Что это блин значит?
...
Рейтинг: 0 / 0
21.07.2015, 19:17
    #39012680
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить название foreign key constraint в EF
RomaMarusyk,

а, кажется допёр что имеется в виду

большой пример, думаю сможешь разобраться чё тут к чему

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
public class ForeignKeyNamingConvention : IStoreModelConvention<AssociationType>
{

    public void Apply(AssociationType association, DbModel model)
    {
        // Identify a ForeignKey properties (including IAs)
        if (association.IsForeignKey)
        {
            // rename FK columns
            var constraint = association.Constraint;
            if (DoPropertiesHaveDefaultNames(constraint.FromProperties, constraint.ToRole.Name, constraint.ToProperties))
            {
                NormalizeForeignKeyProperties(constraint.FromProperties);
            }
            if (DoPropertiesHaveDefaultNames(constraint.ToProperties, constraint.FromRole.Name, constraint.FromProperties))
            {
                NormalizeForeignKeyProperties(constraint.ToProperties);
            }
        }
    }

    private bool DoPropertiesHaveDefaultNames(ReadOnlyMetadataCollection<EdmProperty> properties, string roleName, ReadOnlyMetadataCollection<EdmProperty> otherEndProperties)
    {
        if (properties.Count != otherEndProperties.Count)
        {
            return false;
        }

        for (int i = 0; i < properties.Count; ++i)
        {
            if (!properties[i].Name.EndsWith("_" + otherEndProperties[i].Name))
            {
                return false;
            }
        }
        return true;
    }

    private void NormalizeForeignKeyProperties(ReadOnlyMetadataCollection<EdmProperty> properties)
    {
        for (int i = 0; i < properties.Count; ++i)
        {
            string defaultPropertyName = properties[i].Name;
            int ichUnderscore = defaultPropertyName.IndexOf('_');
            if (ichUnderscore <= 0)
            {
                continue;
            }
            string navigationPropertyName = defaultPropertyName.Substring(0, ichUnderscore);
            string targetKey = defaultPropertyName.Substring(ichUnderscore + 1);

            string newPropertyName;
            if (targetKey.StartsWith(navigationPropertyName))
            {
                newPropertyName = targetKey;
            }
            else
            {
                newPropertyName = navigationPropertyName + targetKey;
            }
            properties[i].Name = newPropertyName;
        }
    }

}     
...
Рейтинг: 0 / 0
21.07.2015, 23:51
    #39012843
RomaMarusyk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить название foreign key constraint в EF
hVostt,

еммм..., спасибо но это не совсем то, что мне нужно. Я находил этот пример в интернете.
Этот пример меняет названия полей FK если они генерируются автоматически. Значит будет не CityType_Id как по умолчанию а CityTypeId.
hVosttЯ не понял что такое «поменять название самого ключа». Что это блин значит?
Прочитайте пожалуйста мое первое сообщение еще раз
RomaMarusyk мне нужно изменить название автогенерируемых foreign key. Стандартно он выглядит так: FK_dbo.City_dbo.CityType_City_CityTypeId но для решения задачи нужно привести его к названию: City_FKC_CityType.
...
Рейтинг: 0 / 0
21.07.2015, 23:54
    #39012845
RomaMarusyk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить название foreign key constraint в EF
возможно этот пример можно превратить в решение моей задачи, но мне потребуется помощь
...
Рейтинг: 0 / 0
23.07.2015, 00:34
    #39014064
RomaMarusyk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить название foreign key constraint в EF
Ок, все спасибо, вот решение моей проблемы
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
public class CustomSqlGenerator : SqlServerMigrationSqlGenerator
{
    protected override void Generate(AddForeignKeyOperation addForeignKeyOperation)
    {
        addForeignKeyOperation.Name = getFkName(addForeignKeyOperation.PrincipalTable,
            addForeignKeyOperation.DependentTable, addForeignKeyOperation.DependentColumns.ToArray());
        base.Generate(addForeignKeyOperation);
    }

    protected override void Generate(DropForeignKeyOperation dropForeignKeyOperation)
    {
        dropForeignKeyOperation.Name = getFkName(dropForeignKeyOperation.PrincipalTable,
            dropForeignKeyOperation.DependentTable, dropForeignKeyOperation.DependentColumns.ToArray());
        base.Generate(dropForeignKeyOperation);
    }

    private static string getFkName(string primaryKeyTable, string foreignKeyTable, params string[] foreignTableFields)
    {
        // Return any format you need
    }
}

public class CustomDbConfiguration : DbConfiguration
{
    public CustomDbConfiguration()
    {
        SetMigrationSqlGenerator(SqlProviderServices.ProviderInvariantName,
            () => new CustomSqlGenerator());
    }
}

[DbConfigurationType(typeof(CustomDbConfiguration))]
public class YourEntities : DbContext

...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как изменить название foreign key constraint в EF / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]