6

自動生成された多対多テーブルの命名規則を変更するにはどうすればよいですか?

2 つのクラスがあるとします。

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というテーブルが作成されます。

たとえば、DbContext の OnModelCreating オーバーライドで次を使用して、その1 つのテーブルの名前をUsersInRolesに変更できます。

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

しかし、私が本当にやりたいことは、命名規則を変更して、自動生成されたすべての多対多テーブルがデフォルトでこの新しい規則を使用するようにすることです。それを行う方法、またはそれが可能かどうかさえわかりません。これらの関係の 1 つを指定するたびに 9 行の余分なコードを指定しなければならないのは好きではありません。

現在、EF バージョン 6.0.0-rc1 を使用しています。

4

1 に答える 1

5

リレーションシップを制御する機能は、使用可能な状態ではなかったため、リリース前に基本規約 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";
            }
        }
    }
于 2013-10-09T21:37:40.417 に答える