【问题标题】:Business Logic that depends on string values依赖于字符串值的业务逻辑
【发布时间】:2012-01-11 22:21:21
【问题描述】:

在我正在进行的一个项目中,我使用的是 Entity Framework 4.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; }
}

现在我的业务逻辑取决于正在创建/编辑的项目类型,所以我有这样的代码:

if( "P".Equals(project.ProjectTypeId) )
    // logic goes here

还有其他不依赖我比较字符串值的方法吗?

【问题讨论】:

  • 这里可以选择多态性吗?
  • 很高兴知道...我很高兴我不使用 EF。

标签: c# entity-framework-4.1 business-logic


【解决方案1】:

我个人更喜欢将 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,并且您的代码应该知道所有这些。当您需要查看所有可以使用的 ProjectTypes 时,这种方法为您提供了一个单一的“事实来源”。我更喜欢其他选项,例如带有字符串常量的类,因为:

  1. 如果您发现项目的项目类型无效,则更容易“快速失败”。
  2. 您可以将ProjectTypes 作为强类型参数传递给实用函数等。

【讨论】:

  • @Dismissile:抱歉,我花了一段时间才回复。 EF 在具体化数据时不支持将字符串转换为枚举,但是您有许多变通方法,例如在第一次调用 get 时执行转换的属性。
【解决方案2】:

我知道这已经得到解答,但我们使用的方法与枚举略有不同:

public static class ProjectType
{
    public const string P = "P";
    public const string N = "N";
}

你仍然有一个单一的事实来源。像枚举一样,常量是在编译时定义的。所以你的客户端代码应该是这样的:

if( ProjectType.P.Equals(project.ProjectTypeId) )
    // logic goes here

它基本上做同样的事情,但不需要Enum.Parse

【讨论】:

    【解决方案3】:

    我同意 Austin 的观点,你真的应该拥有类似的东西。

    公开课项目
    {
    公共 int ID { 获取;放; }

    // snip...      
    
    // Foreign Key      
    public string ProjectId { get; set; }      
    
    // navigation proeprty      
    public virtual IProjectType ProjectType { get; set; }      
    

    }

    公共类 ProjectTypeA : IProjectType
    { 公共字符串 ID { 获取;放; }

    public virtual ICollection<Project> Projects { get; set; } 
    

    }

    公共类 ProjectTypeB : IProjectType
    { 公共字符串 ID { 获取;放; }

    public virtual ICollection<Project> Projects { get; set; } 
    

    }

    然后你可以有类似的东西

    如果(p.ProjectType 是 ProjectTypeB ) {}

    或链接

    var projects = from p in Project.ofType select p;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-06
      • 2016-06-28
      • 2010-10-02
      • 2015-04-23
      • 2011-09-14
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多