在我正在开展的一个项目中,我使用的是Entity Framework 4.1(Code First)。我有两个实体之间的关系,如下所示:
public class Project
{
public int Id { get; set; }
// snip...
// Foreign Key
public string ProjectId { get; set; }
// navigation proeprty
public virtual ProjectType ProjectType { get; set; }
}
public class ProjectType
{
public string Id { get; set; }
public virtual ICollection<Project> Projects { get; set; }
}
现在我的业务逻辑取决于正在创建/编辑的项目类型,所以我有这样的代码:
if( "P".Equals(project.ProjectTypeId) )
// logic goes here
有没有其他方法可以做到这一点,而不依赖于我比较字符串值?
答案 0 :(得分:3)
我个人更喜欢将ProjectTypeId转换为枚举类型。
var projectType = Enum.Parse(typeof(ProjectType), project.ProjectTypeId);
switch(projectType)
{
case ProjectType.P: // logic goes here
case ProjectType.N:
break;
default: throw new ArgumentOutOfRangeException("That wasn't a valid project type");
}
我假设您有一定数量的ProjectTypes,并且您的代码应该知道所有这些。当您需要查看可以使用的所有ProjectType时,此方法为您提供单一的“事实来源”。我比其他选项更喜欢这个,比如带有字符串常量的类,因为:
ProjectType
作为强类型参数传递给实用程序函数等。答案 1 :(得分:2)
我知道这已经得到了解答,但我们使用的方法与枚举略有不同:
public static class ProjectType
{
public const string P = "P";
public const string N = "N";
}
你仍然只有一个事实来源。与枚举类似,consts在编译时定义。所以你的客户端代码看起来像这样:
if( ProjectType.P.Equals(project.ProjectTypeId) )
// logic goes here
它基本上做同样的事情,但不需要Enum.Parse
。
答案 2 :(得分:0)
我同意奥斯汀的观点,你应该有类似的东西......
公共课项目
{
public int Id {get;组; }
// snip...
// Foreign Key
public string ProjectId { get; set; }
// navigation proeprty
public virtual IProjectType ProjectType { get; set; }
}
公共类ProjectTypeA:IProjectType
{
公共字符串Id {get;组; }
public virtual ICollection<Project> Projects { get; set; }
}
公共类ProjectTypeB:IProjectType
{
公共字符串Id {get;组; }
public virtual ICollection<Project> Projects { get; set; }
}
然后你可以拥有像
这样的东西if(p.ProjectType是ProjectTypeB) {}
或链接
var projects = from Project.ofType中的p选择p;