处理多个(可能为空)导航属性的最佳方法是什么?

时间:2017-10-11 08:50:59

标签: c# asp.net-mvc entity-framework

我有3个班级

    public class ActivityLog
    {
          //  The activity log affects an employee
          public int EmployeeID { get; set; }
          public Employee Employee { get; set; }

          //  The activity log affects a department
          public int DepartmentID { get; set; }
          public Department Department { get; set; }
    }

在这个例子中,有两种不同的对象类型可以在视图上显示,但实际上有更多不同的类型,并且将它移动到自己的继承模型似乎不明智。

我希望能够做到以下几点:

    public class ActivityLog<T>
    {
        //  The activity log affects an unknown type
        public T ConcernedObjectID { get; set; }
        public T ConcernedObject { get; set; } 
    }

现在我们在视图中有很多空检查(如果员工为空,则使用部门)。

这是实体框架可以以某种方式提供帮助的东西,还是最好是实现仅代码解决方案(例如接口)?

1 个答案:

答案 0 :(得分:0)

我认为你这里有设计问题。 ActivityLog类尝试做太多。它既是员工和部门日志中的条目。哪些是完全不同的东西。他们唯一的共同点就是可以将它们放入活动日志中。

我要么使用通用接口,要么使用抽象基类。然后,您可以使用asp.net等效的数据模板来可视化数据。

这样的事情:

public abstract class ActivityLogEntry
{
   int Id { get; }
}

public EmployeeActivityLogEntry : ActivityLogEntry
{
    Employee Employee {get;}
}

public DepartmentActivityLogEntry : ActivityLogEntry
{
    Department Department {get;}
}

可以帮助您进行空检查的另一件事是明确指出某些内容可以为null。我使用Optional NuGet包。这给你这样的东西

Option<Employee> Employee {get; }

public string ToString()
{
    return this.Employee.Match(e => e.Name, () => "");
}

在这种情况下,您无法直接访问Option中捕获的Employee。相反,您必须提供Func,以便在有员工(非空)时以及何时没有。可选库中有更多辅助函数。这使得你需要处理这两种情况更加清晰。你不能再对开始为空的东西感到惊讶。

(当然你不应该将Option<T>用于所有内容。只在有时可能为null的属性上使用它。不应该在永远不应为null的属性上,或者你开始隐藏自己的bug。)