gpt4 book ai didi

c# - Entity Framework : map multiple classes to one table

转载 作者:太空狗 更新时间:2023-10-29 20:16:16 29 4
gpt4 key购买 nike

我认为这在 nhiberate 中是可能的,但我的问题是关于 Entity Framework 的。

在我无法修改的数据库模型中,我有多余的列,我想将它们存储在不同的类中。

示例:

public class DateParams
{
public DateTime CreationDate { get; set; }
public DateTime ModificationDate { get; set; }

// some methods
}

public class Localization
{
public String EnglishLabel { get; set; }
public String FrenchLabel { get; set; }

// some methods
}

然后我会在我的一些模型中使用它们:

public class Account // Localization && DateParams 
{
public int ID { get; set; }
public String Name { get; set; }

public Localization Localization { get; set; }
public DateParams DateParams { get; set; }
}

public class Lead // DateParams only
{
public int ID { get; set; }
public String Name { get; set; }

public DateParams DateParams { get; set; }
}

我想实现的是拥有这样的东西

public class LocalizationMap : EntityTypeConfiguration<Localization>
{
public LocalizationMap()
{
Property(e => e.EnglishLabel).HasColumnName("en");
Property(e => e.FrenchLabel).HasColumnName("fr");
}
}

public class AccountMap : EntityTypeConfiguration<Account>
{
public AccountMap()
{
HasKey(x => x.ID);
Property(e => e.Name).HasColumnName("Name");

HasSubMapping(new LocalizationMap());
HasSubMapping(new DateParamsMap());

ToTable("Account");
}
}

我可以使用继承来解决这个问题,但 C# 不允许多重继承。

最佳答案

我不会让你开心的。

有一个名为表拆分 的 EF 功能。顾名思义,这允许我们将一个数据库表映射(拆分)到概念模型中的多个类。在您的例子中,Account 的映射看起来像这样:

class AccountMap : EntityTypeConfiguration<Account>
{
public AccountMap()
{
ToTable("Account");
HasKey(x => x.ID);
HasRequired(a => a.DateParams).WithRequiredPrincipal();
HasRequired(a => a.Localization).WithRequiredPrincipal();
}
}

class DateParamsMap : EntityTypeConfiguration<DateParams>
{
public DateParamsMap()
{
ToTable("Account");
}
}

class LocalizationMap : EntityTypeConfiguration<Localization>
{
public LocalizationMap()
{
ToTable("Account");
}
}

但这立即表明了问题:类型配置中的表名“Account”是硬编码的。无法重用卫星类 DateParamsLocalization对于多种类型。而且,在您尝试之前,EF 不会接受像 DateParams<T> 这样的泛型。 .

这很可悲,因为我能想到的所有其他选项都是丑陋的,或者充其量是笨拙的:

  • 创建 DateParams 的子类和 Localization (以及随附的配置)供需要它们的任何实体使用。
  • 只需将属性添加到所有类型并尽可能多地使用投影(因为我认为这项工作的全部目的是减少您要查询的属性的数量)。
  • 使用一个上下文来托管没有这些属性的主要类型,并使用另一个上下文来托管附属类型(同样,以帮助轻松查询较少的属性)。但不幸的是,您只能从内存中的两个上下文中加入实例,即 LINQ to objects。
  • 创建第三个卫星类,组合两个较小的类,并将这三个类用作基类型。

关于c# - Entity Framework : map multiple classes to one table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36679802/

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