我目前正在开发一个代码优先的小项目:我必须创建一个电影数据库,并且像往常一样,每部电影可以有多个类型(m:n)。由于流派是不变的,我决定创建一个包含所有流派的枚举流派。
在 Movie
表中,我有一个流派列表(枚举)。显然这是错误的,因为您无法在数据库中存储枚举列表。
所以我开始寻找答案。我遇到了很多解决方案,不幸的是它们都没有真正帮助我。所以我决定问这个问题。我知道这可能是重复的,但其他解决方案并没有真正的帮助。
我发现的一些解决方案是 Flags
和 SmartEnum
。
我都尝试了,但并没有真正起作用。您能否看一下我的代码并告诉我我做错了什么,或者是否有其他方法来转换枚举列表。
电影:
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/