ASP.NET MVC中Linq to SQL查找表

3
这真的是一个架构问题。我觉得我处理这个问题的方式可能不对,想要一些关于最佳实践的意见。
假设我有一个 Transactions 表和一个 TransactionTypes 表。视图将提交相应的交易数据,这些数据将在我的控制器中进行处理。问题在于,控制器中的逻辑可能有些复杂,并且TransactionType 不是由视图输入提供的,而是在控制器中计算的。(这可能是我的问题之一)
例如,假设视图提交了一个 ViewModel,它会映射到“取款”交易类型。但是,控制器检测到它需要将其更改为“透支”,因为资金不足。我不想做的是:
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个回答

3
不用担心你是有嵌入式字符串还是强类型值 - 两者都完全可以接受 - 只要符合你的数据库设计即可。
然而,你应该编写一个单一的例程在存储库或帮助类中,然后可以从任何需要它的控制器或操作中调用它 - 如果有任何更改,只需在一个地方进行更改。

1

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

public enum TransactionType {
 Overdraft
}

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

这很简单,但我喜欢它。

更复杂的方法(不确定是否适用于Linq to SQL,但更复杂的ORM支持它(如EF,DO .NET,LLBLGen等))是在数据模型中使用继承和鉴别器。

也就是说,有一个名为OverdraftTransactionType的TransactionType子类,其中包含一个鉴别器(键),用于将不同类型的TransactionTypes与其他类型区分开来。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接