gpt4 book ai didi

c# - 如何使用 Automapper 将 DbGeometry 转换为 String?

转载 作者:行者123 更新时间:2023-12-03 03:13:55 25 4
gpt4 key购买 nike

我有一个包含几何列的空间表。我的实体如下:

public class Tile 
{
public DbGeometry Geometry { get; set; }
}

我正在使用数据传输对象将 Tile 类返回给我的客户端。我还从客户端创建 Tiles,因此我想从字符串(几何图形的众所周知的文本表示形式)转换为 DbGeometry 字段。这是我的 DTO:

public class TileDto
{
public String Geometry { get; set; }
}

现在我的第一个想法是创建自定义转换器,如下所示:

public class DbGeometryToStringConverter : ITypeConverter<DbGeometry, string>
{
public string Convert(ResolutionContext context)
{
var geom = (DbGeometry) context.SourceValue;
return geom.AsText();
}
}
public class StringToDbGeometryConverter : ITypeConverter<string, DbGeometry>
{
public DbGeometry Convert(ResolutionContext context)
{
var wkt = (string) context.SourceValue;

var geom = DbGeometry.FromText(wkt);
if (geom == null || !geom.IsValid) return null;

return geom;
}
}

然后,我使用以下方法将 AutoMapper 配置设置为在两者之间进行映射:

 AutoMapper.Mapper.Initialize(cfg =>
{
// Configure our custom type converter for the DbGeometry class
cfg.CreateMap<DbGeometry, string>().ConvertUsing<DbGeometryToStringConverter>();
cfg.CreateMap<string, DbGeometry>().ConvertUsing<StringToDbGeometryConverter>();

cfg.CreateMap<Tile, TileDto>();
cfg.CreateMap<TileDto, Tile>();
});

但这给了我错误:类型“System.String”没有默认构造函数

我尝试使用 ResolveUsing 方法,但它也给了我一个 NullReferenceException。我已确保所有列都有几何列,因此我不确定它为何为空。

cfg.CreateMap<Tile, TileDto>()
.ForMember(tileDto => tileDto.Geometry,
map => map.ResolveUsing(tile => tile.Geometry.WellKnownValue));

这在 Azure 移动服务后端的 ASP.NET 应用程序中使用,因此调试器因错误而中断的 Controller 是:

public class TileController : TableController<TileDto>
{
private DatabaseContext _context;

protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
_context = new DatabaseContext();
DomainManager = new TileDtoToTileMappedEntityDomainManager(_context, Request, Services);
}

public SingleResult<TileDto> GetTile(string id)
{
// MY ERROR HAPPENS HERE
return Lookup(id);
}
}

public class TileDtoToTileMappedEntityDomainManager : MappedEntityDomainManager<TileDto, Tile>
{
public override SingleResult<TileDto> Lookup(string id)
{
return LookupEntity(t => t.Id == id);
}

public override Task<TileDto> UpdateAsync(string id, Delta<TileDto> patch)
{
return UpdateEntityAsync(patch, id);
}

public override Task<bool> DeleteAsync(string id)
{
return DeleteItemAsync(id);
}
}

我使用 AutoMapper 3.2.1,因为 Azure 移动服务 SDK 依赖于它。我正在尝试在 Azure 移动服务中为我的实体创建 DTO,因此我不完全确定是否是我的 AutoMapper 配置错误,或者我的实体的设置方式是否错误。我按照 this post 中的步骤操作创建 DTO。我需要在 AutoMapper 中进行配置更改才能使其正常工作吗?

最佳答案

感谢@Backs,问题出在我的 AutoMapper 配置上。使用 MapFrom 方法而不是 ResolveUsing 就达到了目的。

这是我的配置:

AutoMapper.Mapper.Initialize(cfg =>
{
cfg.CreateMap<Tile, TileDto>()
.ForMember(tileDto => tileDto.Geometry,
map => map.MapFrom(tile => tile.Geometry.AsText()));

cfg.CreateMap<TileDto, Tile>()
.ForMember(tile => tile.Geometry,
map => map.MapFrom(tileDto => DbGeometry.FromText(tileDto.Geometry)));

cfg.CreateMap<Tile, TileDto>();
cfg.CreateMap<TileDto, Tile>();
});

关于c# - 如何使用 Automapper 将 DbGeometry 转换为 String?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32062898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com