2017-06-20 40 views
0

如何强制EF Core为单个属性处理多个SQL数据类型?目标是处理处理相同类型事物但不统一的多个客户端数据库。是否有强制EF Core忽略SQL数据类型的方法

采取以下措施,这似乎只有在客户端数据库具有十进制兼容数据类型时才起作用。

Public Property PieceThickness As Decimal 
    Get 
     PieceThickness = _pieceThickness 
    End Get 
    Set(value As Decimal) 
     _pieceThickness = value 
    End Set 
End Property 

但是,有些客户端将有一个PieceThickness作为varchar(9)。因此抛出一个错误,即使我手动映射列。

modelBuilder.Entity(Of MailPiece)().Property(Function(t) t.PieceThickness). 
     HasColumnName("Thickness").HasColumnType("varchar(9)") 

“的一个例外,而读财产‘MailPiece.PieceThickness’数据库值发生。期望的类型是‘System.Nullable`1 [System.Decimal]’,但实际值类型的“系统。串'。”

我明显可以有PieceThickness的另一个字符串属性,但如果可能的话,要避免这种情况。使属性成为对象也不起作用。

我明白模型需要完全匹配数据库,但我希望有一个工作。

编辑:我觉得这个最好的办法来处理这种情况是使用工厂模式或提供者工厂:http://www.dofactory.com/net/design-patterns

这样做,我会产生水垢能够解决方案,可以从规范分歧在客户端上以客户为基础。

+0

解决此问题将有助于解决此问题。 https://开头github上。com/aspnet/EntityFramework/issues/242 – Smit

回答

0

我能想到的唯一解决方法是将您从数据库中读取的任何内容转换为Decimal或其他数字类型,并希望那里的数据有效。例如,您可以使用视图并从中读取,并且将其部分定义为

SELECT CAST(PieceThickness AS numeric(18,0)) PieceThickness FROM YourTable 

等字段。然后运行LINQ查询而不是表格。然后你可以为你的领域选择一种可以在各种数据库系统中找到的类型。

更新

看到,因为你可能要执行CRUD操作,我可能会建议另一种变通方法,是不是很优雅。我有一个与我一起工作的数据库,我无法在上创建sprocs和/或视图。它在Unix Timestamp格式中有一些日期,但我需要使用我的代码中的实际日期。我使用的解决办法是这样的...

Public Class Demo 
    Public Property GpsTime As Integer 

    Public Readonly Property AssembledTime As Date 
     Get 
      Return GpsTime.FromUnixTimestamp() 
     End Get 
    End Property 
End Class 

其中FromUnixTimestamp()是一个扩展方法,我来翻译这一点。如果实际上找不到varchar以外的通用类型,则可以将其作为varchar存储在数据库中,并使用类似这样的方法处理它,该方法可以在保存之前写回字符串属性。您只需确保EF核心忽略Decimal属性。

在你的情况,你需要的代码如下所示:

Public Property PieceThickness As String 

Public Property PieceThicknessD As Decimal 
    Get 
     Dim workingValue As Decimal 
     If Decimal.TryParse(PieceThickness, workingValue) Then Return workingValue 
    End Get 
    Set(value as Decimal) 
     PieceThickness = value.ToString() 
    End Set 
End Property 

所以这是我想的解决方法。尽管我仍然认为你应该能够获得各种数据库系统通用的数据类型。

+0

映射到视图是否允许正常的CRUD操作? – DavidTheDev

+0

解决方法是读取数据。我没有使用具有可更新视图的ORM解决方案,因此我无法准确回答该问题。如果你喜欢,你可以用存储过程来做你的恶意软件。或者说,使用非小数的数据类型,你知道你所有的目标平台可以处理 – Fabulous

+0

我已经更新了我的答案,@DavidTheDev检查它是否适用于你现在 – Fabulous

相关问题