【发布时间】:2013-09-28 16:41:21
【问题描述】:
如何更改自动生成的多对多表的命名约定?
假设我有两个类:
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 覆盖中使用以下内容:
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。
【问题讨论】:
-
出于好奇,您为什么真的想这样做?当您不断使用不同的编码时,按惯例编码就会失去所有魅力。
-
你可以看看Custom Conventions。
-
@TonyHopkinson,在我的真实场景中,我正在编写一个框架,该框架会根据其“组件”位置(例如 Core、HR、Finance 等)更改所有带有前缀的表名。虽然我能够为标准表重命名编写一个包罗万象的方法,但它不适用于这些多对多表,我不知道怎么做。至于我的示例,我已经使用该约定很长时间了,并且愿意坚持下去。
-
@GertArnold,我知道您可以编写自定义约定,但仍然不知道我将如何解决这个特定问题,无论是使用自定义约定还是直接使用 DbModelBuilder。
-
恐怕我没有答案。我知道有一些方法可以破坏约定,但我怀疑它们是故意让人痛苦的。
标签: entity-framework ef-code-first entity-framework-6