c# - 如何建模实体以在编译时强制执行数据模型约束?

标签 c# asp.net-mvc oop enums

我有以下数据模型,它用 Events 的子集约束 ItemTypes。每个 ItemType 都有一组有效的 Events,这在 ItemEvent 表中受到限制。例如,视频可以{播放、停止、暂停},图像可以{调整大小、保存或共享},等等。

enter image description here

在实体模型中反射(reflect)此约束的最佳方式是什么,以便我可以获得编译时保证所使用的事件对特定项目有效?具体来说,我正在重构 AddItemEventLog 方法:

public void AddItemEventLog(Item item, string ItemEvent)
{
    //
}

显然,这是一个人为的例子,只是为了说明——它允许开发人员传入他们想要的任何 ItemEvent 字符串。即使我基于 ItemEvent 结果集创建了一个枚举,实体模型中也没有任何东西可以阻止开发人员使用 Video 类型的项目传入 ItemEvent.Resize

我将 Item 作为 Video 的基类,我试图覆盖一个枚举,但现在知道这是不可能的。我对在运行时检查事件的有效性不太感兴趣,因为当数据库引发 FK 违规时我已经抛出异常。如果可能的话,我想在编码时将其消灭在萌芽状态:)

目前有像这样建模的类,但可以进行任何修改:

 //enums.cs
 public enum ItemType : byte
 {
     Video = 1,
     Image = 2,
     Document = 3
 }

 //item.cs
 public class Item : BaseModel
 {
     public int ItemId { get; set; }
     public ItemTypeLookup.ItemType ItemType { get; set; }
     public string ItemName { get; set; }
 }

//video.cs
public class Video : Item
{
    public string Width { get; set; }
    public string Height { get; set; }
    public string Thumb { get; set; }
}

最佳答案

我认为 Code Contracts可能是在编译时强制执行此类操作的唯一方法。在编译时检查之外,编写单元测试以确保正确的功能是下一个最好的事情!

关于c# - 如何建模实体以在编译时强制执行数据模型约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9436983/

相关文章:

asp.net-mvc - 在 Razor View 中有条件地禁用文本框

c# - 具有更多参数的 C# 子类方法中的 OOP 设计

c# - 自定义路由 asp.net mvc 3 问题

asp.net-mvc - VB.NET 中 ViewDataDictionary 实例后的 "!"符号是什么?

php - 如何更改导入类使用的类的命名空间?

c++ - 在一个类中有 "typedef void FuncCharPtr"如何将使用该 typedef 的函数与非静态函数一起使用?

c# - 如何在 C# 中在运行时动态创建和命名对象?

c# - 输出行号

c# - 使用 Moq 模拟方法的某些部分

c# - 如何使用 GridView 进行 foreach