代码之家  ›  专栏  ›  技术社区  ›  Andrew Flanagan

Linq to SQL中的ASP.NET MVC查找表

  •  3
  • Andrew Flanagan  · 技术社区  · 14 年前

    这确实是一个建筑问题。我觉得我这样做是不对的,我需要一些关于最佳实践的意见。

    假设我有一个 Transactions 桌子和 TransactionTypes 桌子。视图将提交在我的控制器中处理的适当事务数据。问题是控制器中的逻辑可能有点复杂,而TransactionType不是由视图输入提供的,而是由控制器计算的。(这可能是我问题的一部分)。

    不要 想做的是:

    transaction.TypeId =
        DataContext.TransactionTypes.Single(x => x.type == "Overdraft").id;
    

    ... 因为我将在代码中嵌入字符串文本。对吗?

    好的,我可以将这些值映射到强类型,这样就可以执行以下操作:

    class TranTypes
    {
       public const long Deposit = 1;
       public const long Withdrawal = 2;
       public const long Overdraft = 3;
    }
    

    ...

    transaction.TypeId =
        DataContext.TransactionTypes.Single(x => x.id == TranTypes.Overdraft);
    

    现在,如果我在数据库中的查找发生变化,我有一个地方可以更新映射,而我的控制器仍然可以洞察模型。

    但这也让人觉得尴尬。

    我觉得我真正想要的是Linq-To-SQL自动代码生成能够生成关联,这样我就可以引用强类型名称(存款、取款和草稿),并确保它始终会在数据库中返回这些名称的当前值。在运行时对查找表所做的更改可能会导致问题,但看起来仍然要干净得多。

    我应该消化什么来理解如何最好地构建这个?

    提前谢谢你让我的大脑扩大。:-)

    2 回复  |  直到 14 年前
        1
  •  3
  •   Clicktricity    14 年前

    不要担心您是否有一个嵌入的字符串或一个强类型的值-两者都是完全可以接受的-这在您的数据库设计中是有意义的。

    但是,您应该做的是在存储库或助手类中编写一个例程,然后您可以从任何控制器或操作需要它的地方调用它—如果有任何更改,则只有一个地方可以进行更改。

        2
  •  1
  •   Jeff    14 年前

    我一直喜欢的一个简单方法是枚举方法。

    public enum TransactionType {
     Overdraft
    }
    
    transaction.TypeId =
        DataContext.TransactionTypes.Single(x => x.type == TransactionType.Overdraft.ToString()).id;
    

    很简单,但我喜欢。

    也就是说,有一个名为overdrifttransactiontype的TransactionType子类,该子类具有一个鉴别器(密钥),该鉴别器可以相互标识不同类型的TransactionType。

    http://weblogs.asp.net/zeeshanhirani/archive/2008/08/16/single-table-inheritance-in-entity-framework.aspx