You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:21:03