powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как изменить название foreign key constraint в EF
11 сообщений из 11, страница 1 из 1
Как изменить название foreign key constraint в EF
    #39012246
Фотография RomaMarusyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую 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
Как изменить название foreign key constraint в EF
    #39012285
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomaMarusykТакже я нашел некоторую информацию о "Custom Code First Conventions"
Нужен ваш совет могу ли я изменить имя ограничения, используя Custom Code First Conventions, или есть какие-либо другие методы реализации?

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

Конвенции -- сила! Раз затянешься, потом не оторваться
...
Рейтинг: 0 / 0
Как изменить название foreign key constraint в EF
    #39012288
Фотография RomaMarusyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у серьезно, как мне переименовать ключ?
...
Рейтинг: 0 / 0
Как изменить название foreign key constraint в EF
    #39012292
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как изменить название foreign key constraint в EF
    #39012359
Фотография RomaMarusyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я видел пример как изменить название колонки для FK, но не знаю можно ли поменять название самого ключа с помощью Конвенции. Помогите пожалуйста, более конкретно так как я слабо розбирюся в этом. Спасибо
...
Рейтинг: 0 / 0
Как изменить название foreign key constraint в EF
    #39012677
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomaMarusykя видел пример как изменить название колонки для FK, но не знаю можно ли поменять название самого ключа с помощью Конвенции. Помогите пожалуйста, более конкретно так как я слабо розбирюся в этом. Спасибо

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

еммм..., спасибо но это не совсем то, что мне нужно. Я находил этот пример в интернете.
Этот пример меняет названия полей FK если они генерируются автоматически. Значит будет не CityType_Id как по умолчанию а CityTypeId.
hVosttЯ не понял что такое «поменять название самого ключа». Что это блин значит?
Прочитайте пожалуйста мое первое сообщение еще раз
RomaMarusyk мне нужно изменить название автогенерируемых foreign key. Стандартно он выглядит так: FK_dbo.City_dbo.CityType_City_CityTypeId но для решения задачи нужно привести его к названию: City_FKC_CityType.
...
Рейтинг: 0 / 0
Как изменить название foreign key constraint в EF
    #39012845
Фотография RomaMarusyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно этот пример можно превратить в решение моей задачи, но мне потребуется помощь
...
Рейтинг: 0 / 0
Как изменить название foreign key constraint в EF
    #39014064
Фотография 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.
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
11 сообщений из 11, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как изменить название foreign key constraint в EF
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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