1

我喜欢 MVC,但不幸的是,所有教程、演示和所有资源都使用实体框架来生成 ViewData,并且大多数使用 LINQ to SQL 而不是 DataSets。
我正在重用现有的业务逻辑,而客户(他本身就是一个伟大的编码员)想要继续使用数据集......所以我无法摆脱这些。

我有一张表,其中包含在数据库中允许为 NULL 的列。当我尝试访问这些......甚至检查它是否为空时,我得到一个异常:

“表 'FNN_CARRIERS_DESC' 中列 'FNN_CARRIERS_DESC' 的值为 DBNull”

现在这是由 dataset.designer.vb 文件生成的。

我知道你要说什么。“FNN_BRAND 为空!!!” 这是真的。但是...按照堆栈跟踪,我的代码中产生此错误的行是这样的:

 <%= Html.TextBox("FNN_CARRIERS_DESCTextBox", If(IsNothing(Model.FNN_CARRIERS_DESC), Model.FNN_CARRIERS_DESC, ""))%>

指导将不胜感激!我的直觉告诉我这不是严格意义上的 MVC 问题,但也许我对数据集不了解。

这是 reference.vb 文件中引发异常的代码:

<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
     Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")>  _
    Public Property FNN_CARRIERS_DESC() As String
        Get
            Try 
                Return CType(Me(Me.tableVIT_FNN_CommsService.FNN_CARRIERS_DESCColumn),String)
            Catch e As Global.System.InvalidCastException
                Throw New Global.System.Data.StrongTypingException("The value for column 'FNN_CARRIERS_DESC' in table 'VIT_FNN_CommsService' is DBNul"& _ 
                        "l.", e)
            End Try
        End Get
        Set
            Me(Me.tableVIT_FNN_CommsService.FNN_CARRIERS_DESCColumn) = value
        End Set
    End Property

我尝试过的事情:

  • 注释掉异常将使其返回 null 这是我想要的,但是当表更改或生成表结果的存储过程发生更改时,将重建数据集。
  • 更改了数据表上列的规则。实际上没有产生任何结果,并且也将在表重新生成时被覆盖。
  • IsNothing(column) 或 isDBnull(column) 实际上会导致错误,因为正在检索和转换列。

我需要知道解决这个问题的最佳方法,希望与 MVC 架构保持一致。

帮助我的书呆子们......你是我唯一的希望!

4

2 回答 2

1

好的,所以你有一些依赖数据集的现有数据访问逻辑。这很好(想想它可能会像 VB6 一样糟糕得多 :-))。我们都必须处理遗留代码。这很正常。遗留代码无处不在。

虽然这不是用它污染你闪亮的新 MVC 应用程序的理由。所以这就是我的建议。将此遗留代码封装到一些仅适用于强类型的外部存储库中。例子:

Public Interface IProductsRepository
    Function GetProduct(id As Integer) As Product
End Interface

然后实施:

Public Class LegacyProductsRepository
    Implements IProductsRepository
    Public Function GetProduct(id As Integer) As Product
        ' TODO: call your legacy code here and convert the datasets
        ' and datatables you were dealing with into a nice strongly
        ' typed model object
    End Function
End Class

现在你的控制器应该永远不必听到这样的数据集和废话:

Public Class ProductsController
    Inherits Controller
    Private ReadOnly _repository As IProductsRepository
    Public Sub New(repository As IProductsRepository)
        _repository = repository
    End Sub

    Public Function Show(id As Integer) As ActionResult
        Dim product = _repository.GetProduct(id)
        Return View(product)
    End Function
End Class

你看。现在一切都很干净和简单。您的视图适用于强类型产品对象,不应该处理数据集和数据表,并且您所描述的异常永远不会发生:-)

于 2011-01-20T08:35:41.307 回答
0

如果有人感兴趣,我找到了一个更好的解决方案......一个让您继续使用数据集而中间没有层的解决方案。

一列可以为空,数据集实际上为您提供了一种方法。

Model.isFNN_CARRIERS_DESCNull()

因此可以检查此列的可空性...而不会导致崩溃。

于 2011-09-14T09:56:17.980 回答