我的EF代码第一个应用程序必须与SQL Server和Oracle一起使用。
nvarchar2(38)
。是否有办法全局覆盖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()的行为
答案 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