Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何更改多对多表关系的命名约定?_Entity Framework_Ef Code First_Entity Framework 6 - Fatal编程技术网

Entity framework 如何更改多对多表关系的命名约定?

Entity framework 如何更改多对多表关系的命名约定?,entity-framework,ef-code-first,entity-framework-6,Entity Framework,Ef Code First,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; se

如何更改自动生成的多对多表的命名约定

假设我有两个类:

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; }
}
公共类用户
{
public int UserId{get;set;}
公共虚拟列表角色{get;set;}
}
公共阶级角色
{
public int RoleId{get;set;}
公共虚拟列表用户{get;set;}
}
默认情况下,这将创建一个名为UserRoles的表

我可以将该one表的名称更改为UsersInRoles,例如,在我的DbContext的OnModelCreating覆盖中使用以下命令:

modelBuilder.Entity<User>()
    .HasMany(p => p.Roles)
    .WithMany(p => p.Users)
    .Map(mc =>
    {
        mc.MapLeftKey("UserId");
        mc.MapRightKey("RoleId");
        mc.ToTable("UsersInRoles");
    });
modelBuilder.Entity()
.HasMany(p=>p.Roles)
.WithMany(p=>p.Users)
.Map(mc=>
{
mc.MapLeftKey(“用户ID”);
mc.MapRightKey(“RoleId”);
mc.ToTable(“用户角色”);
});
但是,我真正想做的是更改命名约定,以便在默认情况下,所有自动生成的多对多表都使用此新约定。我不知道该怎么做,或者这是否可能。我不喜欢每次指定其中一个关系时都必须指定9行额外代码


我目前使用的是EF版本6.0.0-rc1。

在发布之前,控制关系的功能已从基本约定API中删除,因为它未处于可用状态。您可以通过基于模型的约定访问模型中的所有属性和表。此处提供了基于模型的约定概述:

这个解决方案需要对元数据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";
            }
        }
    }
公共类MyConvention:IStoreModelConvention
{
公共void应用(EntitySet、DbModel模型)
{
var properties=set.ElementType.properties;
如果(properties.Count==2)
{
var relationEnds=新列表();
int i=0;
foreach(属性中的var metadataProperty)
{
if(metadataProperty.Name.EndsWith(“\u ID”))
{
var name=metadataProperty.name;
添加(name.Substring(0,name.Length-3));
i++;
}
}
if(relationEnds.Count==2)
{
set.Table=relationEnds.ElementAt(0)+“”+relationEnds.ElementAt(1)+“RelationTable”;
}
}
}

出于好奇,你为什么真的想这么做?如果你一直使用不同的表,那么按惯例编码就失去了它的魅力。你可以看看。@TonyHopkinson,在我的真实场景中,我正在编写一个框架,根据表名的“组件”位置(如Core、HR、Finance等)使用前缀更改所有表名。虽然我能够为标准表重命名编写一个全面的规范,但它对这些多对多表不起作用,我也不知道如何操作。例如,我已经使用该规范很长时间了,我很想坚持使用它。@GertArnold,我知道你可以编写自定义规范,但我仍然不知道如何解决这个问题特别的问题,无论是自定义约定还是直接使用DbModelBuilder。恐怕我没有答案。我知道有一些方法会破坏约定,但我怀疑它们是故意造成的。我对此进行了一些尝试,但发现EntityType约定不允许我重命名表。Set Name属性是内部。同样,我不得不手动重命名每个表。上面的约定解决了您的问题吗?还是您还需要其他东西?不,那太好了!不能说我对EDM部分非常熟悉,但这很有效。谢谢!