C# 依赖于字符串值的业务逻辑
在我的一个项目中,我正在使用EntityFramework4.1(代码优先)。我在两个实体之间有如下关系:C# 依赖于字符串值的业务逻辑,c#,entity-framework-4.1,business-logic,C#,Entity Framework 4.1,Business Logic,在我的一个项目中,我正在使用EntityFramework4.1(代码优先)。我在两个实体之间有如下关系: public class Project { public int Id { get; set; } // snip... // Foreign Key public string ProjectId { get; set; } // navigation proeprty public virtual ProjectType Proj
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; }
}
是否有其他方法不依赖于我比较字符串值来完成此操作?我个人更喜欢将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");
}
我假设您有固定数量的项目类型,并且您的代码应该知道所有这些类型。当您需要查看所有可使用的项目类型时,这种方法为您提供了一个单一的“真相来源”。与其他选项(如带有字符串常量的类)相比,我更喜欢此选项,因为:
ProjectType
s作为强类型参数传递给实用程序函数等我个人更喜欢将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");
}
我假设您有固定数量的项目类型,并且您的代码应该知道所有这些类型。当您需要查看所有可使用的项目类型时,这种方法为您提供了一个单一的“真相来源”。与其他选项(如带有字符串常量的类)相比,我更喜欢此选项,因为:
ProjectType
s作为强类型参数传递给实用程序函数等我知道这已经得到了回答,但我们使用的方法与Enum略有不同:
public static class ProjectType
{
public const string P = "P";
public const string N = "N";
}
你仍然有一个单一的真相来源。与枚举一样,常量是在编译时定义的。因此,您的客户端代码如下所示:
if( "P".Equals(project.ProjectTypeId) )
// logic goes here
if( ProjectType.P.Equals(project.ProjectTypeId) )
// logic goes here
它基本上做了相同的事情,但不需要
Enum.Parse
我知道这已经得到了回答,但我们使用的方法与Enum略有不同:
public static class ProjectType
{
public const string P = "P";
public const string N = "N";
}
你仍然有一个单一的真相来源。与枚举一样,常量是在编译时定义的。因此,您的客户端代码如下所示:
if( "P".Equals(project.ProjectTypeId) )
// logic goes here
if( ProjectType.P.Equals(project.ProjectTypeId) )
// logic goes here
它基本上做了相同的事情,但不需要
Enum.Parse
我同意Austin的观点,你应该有这样的东西
公共类项目{
公共int Id{get;set;}
// snip...
// Foreign Key
public string ProjectId { get; set; }
// navigation proeprty
public virtual IProjectType ProjectType { get; set; }
}
公共类项目类型A:IProjectType{ 公共字符串Id{get;set;}
public virtual ICollection<Project> Projects { get; set; }
public virtual ICollection<Project> Projects { get; set; }
公共虚拟ICollection项目{get;set;}
}
公共类项目类型B:IProjectType{ 公共字符串Id{get;set;}
public virtual ICollection<Project> Projects { get; set; }
public virtual ICollection<Project> Projects { get; set; }
公共虚拟ICollection项目{get;set;}
}
然后你可以吃点像
如果(p.ProjectType为ProjectTypeB)
{}
或用于链接
var projects=项目中的p。OF类型选择p 我同意奥斯汀的观点,你真的应该有 公共类项目
{
公共int Id{get;set;}
// snip...
// Foreign Key
public string ProjectId { get; set; }
// navigation proeprty
public virtual IProjectType ProjectType { get; set; }
}
公共类项目类型A:IProjectType{ 公共字符串Id{get;set;}
public virtual ICollection<Project> Projects { get; set; }
public virtual ICollection<Project> Projects { get; set; }
公共虚拟ICollection项目{get;set;}
}
公共类项目类型B:IProjectType{ 公共字符串Id{get;set;}
public virtual ICollection<Project> Projects { get; set; }
public virtual ICollection<Project> Projects { get; set; }
公共虚拟ICollection项目{get;set;}
}
然后你可以吃点像
如果(p.ProjectType为ProjectTypeB)
{}
或用于链接
var projects=项目中的p。OF类型选择p 多态性是一种选择吗?很高兴知道。。。我很高兴我没有使用EF。多态性是一个选项吗?很高兴知道。。。“我想我很高兴我没有使用EF。@Dismissible:对不起,我花了一段时间才回复。EF不支持将字符串转换为枚举,因为它会具体化数据,但有许多变通方法,例如在第一次调用
get
时执行转换的属性。@Dismissible:抱歉,我花了一些时间才作出响应。EF不支持将字符串转换为枚举,因为它会具体化数据,但有许多变通方法,例如在第一次调用get
时执行转换的属性。