Как изменить соглашение об именах отношений «Многие-ко-многим»?

ef-code-first entity-framework entity-framework-6

Вопрос

Как я могу изменить правило именования автоматически созданной таблицы «многие-ко-многим»?

Предположим, у меня есть два класса:

public class User
{
    public int UserId { get; set; }
    public virtual List<Role> Roles { get; set; }
}

public class Role
{
    public int RoleId { get; set; }
    public virtual List<User> Users { get; set; }
}

По умолчанию это создаст таблицу UserRoles .

Я могу изменить имя этой одной таблицы в UserInRoles , например, используя следующее в переопределении OnModelCreating моего DbContext:

modelBuilder.Entity<User>()
    .HasMany(p => p.Roles)
    .WithMany(p => p.Users)
    .Map(mc =>
    {
        mc.MapLeftKey("UserId");
        mc.MapRightKey("RoleId");
        mc.ToTable("UsersInRoles");
    });

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

В настоящее время я использую EF версию 6.0.0-rc1.

Принятый ответ

Возможность управления отношениями была удалена из API основных соглашений до выпуска, поскольку она не была в состоянии использования. Вы можете получить доступ ко всем свойствам и таблицам в модели через условные обозначения моделей. Обзор соглашений на основе моделей доступен здесь: http://msdn.microsoft.com/en-US/data/dn469439

Это решение включает в себя немного больше копания в API метаданных, EntitySet является правильным типом для этого сценария

Это соглашение должно переименовать созданную таблицу отношений:

public class MyConvention : IStoreModelConvention<EntitySet>
{
    public void Apply(EntitySet set, DbModel model)
    {
        var properties = set.ElementType.Properties;
        if (properties.Count == 2)
        {
            var relationEnds = new List<string>();
            int i = 0;
            foreach (var metadataProperty in properties)
            {
                if (metadataProperty.Name.EndsWith("_ID"))
                {
                    var name = metadataProperty.Name;
                    relationEnds.Add(name.Substring(0, name.Length - 3));
                    i++;
                }
            }
            if (relationEnds.Count == 2)
            {
                set.Table = relationEnds.ElementAt(0) + "_" + relationEnds.ElementAt(1) + "_RelationTable";
            }
        }
    }


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему