c# - 如何使用 EF 5 存储枚举列表

标签 c# entity-framework enums code-first

我目前正在开发一个代码优先的小项目:我必须创建一个电影数据库,并且像往常一样,每部电影可以有多个类型(m:n)。由于流派是不变的,我决定创建一个包含所有流派的枚举流派。

Movie 表中,我有一个流派列表(枚举)。显然这是错误的,因为您无法在数据库中存储枚举列表。

所以我开始寻找答案。我遇到了很多解决方案,不幸的是它们都没有真正帮助我。所以我决定问这个问题。我知道这可能是重复的,但其他解决方案并没有真正的帮助。

我发现的一些解决方案是 FlagsSmartEnum

我都尝试了,但并没有真正起作用。您能否看一下我的代码并告诉我我做错了什么,或者是否有其他方法来转换枚举列表。

电影:

class Serie
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    [MaxLength(255)]
    public string Titel { get; set; } = "";

    public virtual List<Genres> Genres { get; } = new();
}

流派:

public sealed class Genres : SmartEnum<Genres>
{
    public static readonly Genres Drama = new(name: "Drama", value: 1);
    public static readonly Genres Crime = new(name: "Crime", value: 2);
    ...

    private Genres(string name, int value) : base(name, value)
    { }
}

PS:我知道我可以用一个额外的类来做到这一点,但我想用枚举来做到这一点。

最佳答案

EF 可以很好地使用枚举,但考虑到可以添加新的类型,我不认为您使用电影类型的示例是枚举的良好候选者。 SmartEntity的使用只是一个类包装器。

您的流派示例是多对多关系,因此查看数据库端您会看到类似的内容:

Genres
 - GenreId (PK)
 - Name

Series
 - SeriesId (PK)

SeriesGenres
 - SeriesId (PK, FK)
 - GenreId (PK, FK)
 

Genre 是一个简单的类,因此老实说,用像 SmartEnum 这样的结构类包装它并没有真正的好处。最终,您将希望 EF 像任何其他实体一样对待它,以便您可以有效地查询它。 EF Core 5 可以容纳多对多关系,而无需定义 SeriesGenre 实体,其中 Series 只需具有 Genre 集合,然后配置 HasMany(x => x.Genres).WithMany() SeriesGenre 表和 FK 的关系和配置。 EF 可以在幕后处理其余的事情。

枚举的一个更好的例子是类似状态的东西,您需要一组固定的状态,业务规则逻辑将对其执行操作并且不会更改,除非系统更新以考虑新的状态。例如:

///<summary>
/// Enumeration for order statuses. Ensure this matches the OrderStatuses table.
///</summary>
public enum OrderStatus
{
    None = 0,
    Pending = 1,
    Packing = 2,
    Review = 3,
    Shipped = 4,
    Delivered = 100
}

在这种情况下,订单将记录任何时间点的状态。业务逻辑将取决于当前的状态。我们希望将订单记录存储为 Status,但仍确保我们的数据库具有引用完整性,因此我们将拥有一个 Statuses 表,其中包含与 Enum 中的内容相匹配的相应 OrderStatusIds。然后,Orders 表中的 OrderStatusId 列可以对 OrderStatuses 表具有 FK 约束,以保持数据库中的引用完整性。 OrderStatus 永远不会获得实体声明。

我在这样做时的主要建议是:

  • 枚举保存表 PK 列不应使用自动增量,而应使用显式 ID 来匹配 Enum。
  • 同样,枚举对于每个值都应该是明确的,而不是依赖于自动增量。
  • 应记录表格和枚举以引用它们的相互依赖关系。

关于c# - 如何使用 EF 5 存储枚举列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70010368/

相关文章:

java - 我可以去掉这个开关和枚举吗?

c# - 在 SQL Server 中将标识列重置为零?

c# - 异步任务和锁

c# - 在 C# 中,在类中引用成员属性的普遍接受方式是什么?

c# - 如何在 Entity Framework 中设置两个相同类型的导航属性

C# Entity Framework 每个 HttpContext 只使用一个 ObjectContext

c# - 如何从基类中获取自定义属性?

c# - PagedList 在第二页上丢失搜索过滤器

c# - 使用自定义 SqlMapper.ITypeHandler 将枚举映射到字符串列 - Dapper

c - 来源洞察 : Show me Enum Values