如何更改多對多表關係的命名約定?

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的表。

我可以將一個表的名稱更改為UsersInRoles ,例如,在我的DbContext的OnModelCreating覆蓋中使用以下內容:

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; }
}

但是,我真正想要做的是更改命名約定,以便默認情況下,所有自動生成的多對多表都使用此新約定。我無法弄清楚如何做到這一點,或者甚至可能。我不希望每次指定其中一個關係時都必須指定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
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因