实体框架5代码优先多对多表用继承类重新命名(TPC)
本文关键字:继承 新命名 TPC 框架 代码 实体 | 更新日期: 2023-09-27 17:58:19
好的,当我试图指定连接表的名称时,Entity框架出现了一些问题,如下所示:
// Used by a bunch of things...
public abstract BaseClass
{
public int Id { get; set; }
public string Name { get; set; }
}
public abstract ThingsBaseClass : BaseClass
{
public virtual ICollection<Things> Things { get; set; }
}
public First : ThingsBaseClass
{
// This holds items of type First and doesn't have any other properties
}
public Second : ThingsBaseClass
{
// This holds items of type Second and doesn't have any other properties
}
public Things
{
public int Id { get; set; }
public string Description { get; set; }
// Many to Many
public virtual ICollection<First> Firsts { get; set; }
public virtual ICollection<Second> Seconds { get; set; }
}
所以一切都很好,除了表格如下:
First
FirstThings
Second
SecondThings
Things
我正在尝试重命名为:
First
Second
ThingFirsts
ThingSeconds
Things
尝试使用以下代码重命名它们会出现一些非常奇怪和随机的错误:
public class ThingConfiguration : EntityTypeConfiguration<Thing>
{
HasMany(x => x.Firsts)
.WithMany(x => x.Things)
.Map(x => x.ToTable("ThingFirsts"));
HasMany(x => x.Firsts)
.WithMany(x => x.Things)
.Map(x => x.ToTable("ThingSeconds"));
}
我正在尝试使用代码优先迁移来更新数据库(或者只是从头开始创建)
错误包括以下几种:
Schema specified is not valid. Errors:
(28,6) : error 0040: Type Thing_First is not defined in namespace Project.Domain.Repositories (Alias=Self).
或
Schema specified is not valid. Errors:
(126,6) : error 0074: NavigationProperty 'Thing' is not valid. Type 'Project.Domain.Repositories.Second' of FromRole 'Thing_Firsts_Target' in AssociationType 'Project.Domain.Repositories.Thing_Second' must exactly match with the type 'Project.Domain.Repositories.First' on which this NavigationProperty is declared on.
如果我去掉了First和Second的继承,直接放入Id
、Name
和ICollection<Thing> Things
,它就可以正常工作。
除了我有大约5个这样的对象具有几乎相同的BaseClass
es并希望保持其DRY之外,没有理由使用继承。
我应该咬紧牙关,到处重复代码,让实体框架更简单吗?
我是不是错过了一些简单的东西?我会在使用继承类时遇到其他"gotcha"吗?
EF 6对此有更好的支持吗?
我只需要在模型类定义中使用该属性。
[TableName("WhateverYouWant")]
public class First{}
您可能需要考虑"偏爱组合而非继承",将共享值视为属性而非基类,并使用接口对其进行多态处理。DRY很重要,但对行为来说更重要。具有相同属性的两个对象不应该自动导致基类生成,具有相同行为的两个类更有可能生成。继承和其他面向对象的方法是为了规范行为,而不是规范数据和属性。毕竟,实现同一接口的所有2个类都将具有重复的属性定义;没关系。