我喜欢MVC,但不幸的是,所有教程,演示和所有资源都使用实体框架来生成ViewData,并且大多数使用LINQ将其用于SQL代替数据集。
我要重复使用现有的业务逻辑,客户(他本身就是一位出色的编码员)想要继续使用数据集...所以我不能远离这些数据集。

我有一个表,其中包含列在数据库中为null的列。当我尝试访问这些...即使检查是否为null,我会得到例外:

“列的值'fnn_carriers_desc'在表'fnn_carriers_desc'is dbnull中的值

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

我知道你要说什么。 “ fnn_brand是无效的!!”这是真的。但是...遵循生成此错误的堆栈跟踪和我的代码中的行是:

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

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

这是引发异常的参考文件中的代码:

<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,这是我想要的,但是当表更改或生成表结果的存储过程时,数据集将被重建。
  • 更改了DataTable上的列的规则。实际上没有结果,也将被覆盖在表再生中。
  • ISNOTHING(列)或ISDBNULL(列)实际上会导致错误,因为列被检索和铸造。

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

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

有帮助吗?

解决方案 2

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

一列是无效的,数据集实际上为您提供了一种方法。

Model.isFNN_CARRIERS_DESCNull()

因此,可以检查此列的无效性...而不会引起崩溃。

其他提示

好的,因此您拥有一些依赖数据集的现有数据访问逻辑。这很好(认为它可能像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

你看。现在一切都干净整洁。您的视图可与强烈键入的产品对象一起使用,并且不应处理数据集和数据集以及像您所描述的那样的例外情况,应该永远不会发生:-)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top