我正在使用Empty EF Designer Model创建一个Entity Framework 6数据库。
我的问题可以重复如下。我有两张桌子,他们之间有多对多的关联。
当我生成数据库时,它会创建第三个映射表,我希望如此。但是,列的名称是意外的。
CREATE TABLE [dbo].[WordWordType] (
[Words_WordId] int NOT NULL,
[WordTypes_WordTypeId] int NOT NULL
);
请注意,映射表的列名有些多余且冗长。列名称包括表名称,该表名称是多余的,后跟下划线,后跟键列名称。
WordWordType
- Words_WordId
- WordTypes_WordTypeId
我希望EF 6能够创建一个包含不包含表名和下划线的列名的映射表。我需要表格如下。
WordWordType
- WordId
- WordTypeId
答案 0 :(得分:0)
在Code First中,您可以使用流畅的API
modelBuilder.Entity<Word>()
.HasMany(w => w.WordTypes)
.WithMany(wt => wt.Words)
.Map(x =>
{
x.ToTable("WordWordType");
x.MapLeftKey("WordId");
x.MapRightKey("WordTypeId");
});
但是由于您首先使用模型,我认为唯一的方法是更改负责生成SQL脚本的T4文件。您可以在模型属性的Database Script Generation
部分找到它。
<强>更新强>
请参阅this以了解调试T4。
SSDLToSQL10.tt
包含两个主要部分,一个是第150行的Creating all tables
,另一个是第196行的Creating all FOREIGN KEY constraints
,它们在Store.GetAllEntitySets()
上枚举Store.GetAllAssociationSets()
1}}并在数据库中创建表和外键,调试T4文件并查看映射表的创建位置,我怀疑它在Store.GetAllEntitySets()
中,然后按照您想要的方式更改生成。
答案 1 :(得分:0)
目前,您的主键列名中已有表名,在我看来,这是一个冗余信息。
如果您的主要名称列只是Id
,则EF会自动为您的列Word_Id
和WordType_Id
命名。