gpt4 book ai didi

c# - Entity Framework 5 代码优先多对多表重命名继承类 (TPC)

转载 作者:行者123 更新时间:2023-11-30 18:35:36 26 4
gpt4 key购买 nike

好的,当我尝试按如下方式指定连接表的名称时, Entity Framework 遇到了一些问题:

// 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 , NameICollection<Thing> Things它可以正常工作。

除了我有大约 5 个具有几乎相同的 BaseClass 的对象外,没有理由使用继承。 es 并希望保持干燥。

我是否应该硬着头皮在各处重复代码以使其对 Entity Framework 更简单?

我是不是漏掉了一些简单的东西?我会在使用继承类时遇到任何其他“问题”吗?

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

最佳答案

我只会在模型类定义中使用属性。

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

您可能想要考虑“优先组合优于继承”并将共享值视为属性而不是基类,并使用接口(interface)以多态方式处理它们。 DRY 很重要,但对于行为更是如此。具有相同属性的两个对象不应该自动导致基类产生,具有相同行为的两个类更有可能产生。继承和其他面向对象的方法是关于规范化行为,而不是关于规范化数据和属性。毕竟实现相同接口(interface)的 2 个类将具有重复的属性定义;没关系。

关于c# - Entity Framework 5 代码优先多对多表重命名继承类 (TPC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14782892/

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