实体框架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的继承,直接放入IdNameICollection<Thing> Things,它就可以正常工作。

除了我有大约5个这样的对象具有几乎相同的BaseClasses并希望保持其DRY之外,没有理由使用继承。

我应该咬紧牙关,到处重复代码,让实体框架更简单吗?

我是不是错过了一些简单的东西?我会在使用继承类时遇到其他"gotcha"吗?

EF 6对此有更好的支持吗?

实体框架5代码优先多对多表用继承类重新命名(TPC)

我只需要在模型类定义中使用该属性。

[TableName("WhateverYouWant")]
public class First{} 

您可能需要考虑"偏爱组合而非继承",将共享值视为属性而非基类,并使用接口对其进行多态处理。DRY很重要,但对行为来说更重要。具有相同属性的两个对象不应该自动导致基类生成,具有相同行为的两个类更有可能生成。继承和其他面向对象的方法是为了规范行为,而不是规范数据和属性。毕竟,实现同一接口的所有2个类都将具有重复的属性定义;没关系。