C# 依赖于字符串值的业务逻辑

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

在我的一个项目中,我正在使用EntityFramework4.1(代码优先)。我在两个实体之间有如下关系:

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
    时执行转换的属性。