实体框架:将C#中的Guid属性映射到数据库字符串

时间:2015-04-29 20:49:34

标签: c# oracle entity-framework converter

我的EF代码第一个应用程序必须与SQL Server和Oracle一起使用。

  • 在Oracle中,没有Guid类型,因此它们存储为nvarchar2(38)
  • 在SQL Server中,有一个GUID类型,因此没有问题。

是否有办法全局覆盖Oracle Entity Framework提供程序的行为,以便数据库中映射到POCO类中的Guid类型的任何列都可以具有自定义转换行为?

现在有些人可能会说,"不要将Guids存储为Oracle中的字符串!使用RAW(16)代替因为EF与#34;很好地配合使用。不幸的是,这不是一个选择。

我可以"教导"实体框架如何将字符串数据库值转换为Guids?

更新

我刚刚找到了this链接,这表明该功能不是EF6原生的,但可能会在将来的版本中出现。

此外,我不希望通过映射私有属性来显示自定义转换器,如here

所示

更新

这里是来自" System.String'的无效演员表的堆栈跟踪。到' System.Guid'"例外

at System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider) at System.String.System.IConvertible.ToType(Type type, IFormatProvider provider) at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) at Oracle.DataAccess.Client.OracleDataReader.ChangeType(Object sourceValue, Type targetType) at Oracle.DataAccess.Client.OracleDataReader.GetValue(Int32 i) at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader1.GetUntypedValueDefault(DbDataReader reader, Int32 ordinal) at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader1.GetValue(DbDataReader reader, Int32 ordinal) at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.GetColumnValueWithErrorHandling[TColumn](Int32 ordinal) at lambda_method(Closure , Shaper ) at System.Data.Entity.Core.Common.Internal.Materialization.Coordinator1.ReadNextElement(Shaper shaper)

我发现Asad对here做出贡献的帖子表明您可以更改由Oracle数据访问提供程序调用的System.Convert.ChangeType()的行为

2 个答案:

答案 0 :(得分:0)

我从来没有找到解决方案。除非提供不同版本的Oracle EF提供程序以支持此功能,否则解决方案是将表示guid的事物的字符串属性映射到db中的字符串。我这样做了

class Thing { [Required] [StringLength(38)] //38 is the length of a guid with curlies on it public string GuidID { get; set;} }

然后我确保在存储新值时为guids执行相同的ToString()格式,并使用Guid.Parse()来检索答案中提到的Chris1804505值。

答案 1 :(得分:-1)

C#有一个内置的GUID类,你可能想要考虑使用它。 https://msdn.microsoft.com/en-us/library/system.guid%28v=vs.110%29.aspx

然后,当您需要将类插入数据库时​​,您可以GUID.ToString()并通过Guid.Parse(GUID)创建一个guid。 我可能会稍微做一点,但它应该适合你。

就EF而言。自从我使用它以来已经有一段时间了,但您可能希望将Generated更改为代码。或者实现自定义类或属性来更新/更改GUID