gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:36:13 27 4
gpt4 key购买 nike

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

假设我有两个类:

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

默认情况下,这将创建一个名为 的表。用户角色 .

我可以改名字 表到 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");
});

但是,我真正想做的是更改命名约定,以便默认情况下所有自动生成的多对多表都使用这个新约定。我无法弄清楚如何做到这一点,或者甚至可能。我不喜欢每次指定这些关系之一时都必须指定 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";
}
}
}

关于entity-framework - 如何更改多对多表关系的命名约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19069242/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com