C# EF Core中Object转String引发栈溢出问题求助
问题:Object转String时栈溢出错误及优化实现
场景描述
调用API接口并将响应映射至实体类,由于EF Core不支持Object数据类型,尝试将未映射的Object属性start_latlng转换为String类型的start_latlng2存入数据库。
实体类属性示例
public DateTime? start_date_local { get; set; } public string? timezone { get; set; } public double? utc_offset { get; set; }
未映射的Object属性
[NotMapped] public object? start_latlng { get; set; }
错误的转换属性写法
public string start_latlng2 { get { return start_latlng2; } set { start_latlng2 = Convert.ToString(start_latlng); } }
运行时错误信息
Stack overflow. Repeat 19126 times: -------------------------------- at SportAnalytics.DataModel.Activity.get_start_latlng2() -------------------------------- at DynamicClass.lambda_method171(System.Runtime.CompilerServices.Closure, Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.EnsureOriginalValues() at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntrySubscriber.SnapshotAndSubscribe(Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry)
错误原因
你的start_latlng2属性实现存在无限递归:
get方法中直接返回start_latlng2,每次调用get都会触发自身的get访问器,导致无限循环;set方法中又给start_latlng2赋值,同样会触发set访问器的递归调用。
这种递归会不断消耗栈空间,最终引发栈溢出错误。
正确实现方式
基础转换实现
如果仅需要将start_latlng转为字符串,直接在get访问器中转换源属性即可,无需递归调用自身:
// 注意:如果允许null,建议将类型改为string? public string? start_latlng2 { get => Convert.ToString(start_latlng); // 若不需要从数据库反向赋值,可省略set;若需要,可根据需求处理反序列化逻辑 }
Convert.ToString()会自动处理start_latlng为null的情况,返回空字符串;若希望返回null,可改用start_latlng?.ToString()。
更优实现(序列化结构化数据)
如果start_latlng是数组、自定义类等结构化数据,直接调用ToString()只会返回类型名称(如System.Double[]),无法保留实际数据。此时建议序列化为JSON字符串,方便后续读取和反序列化:
using System.Text.Json; // ... public string? start_latlng2 { get { if (start_latlng == null) return null; return JsonSerializer.Serialize(start_latlng); } // 如需从数据库加载后反序列化回start_latlng,可添加set逻辑: // set // { // if (string.IsNullOrEmpty(value)) // start_latlng = null; // else // start_latlng = JsonSerializer.Deserialize<object>(value); // // 若知道具体类型,可替换为实际类型,如double[]、LatLng等 // } }
内容的提问来源于stack exchange,提问作者chwunder
相关产品推荐
相关产品推荐

