首页 > 解决方案 > 将 Id 转换为字符串类型

问题描述

该模型表示具有 Id 的简单对象。Id 映射到也是数字类型的 DB 列。但要求是将数字和字符串格式的 Id 都传递给客户端。这是必需的,因为 Id 是 bigInt 并且某些客户端应用程序不支持 bigInt 类型,因此应将字符串变体传递给客户端。

但是,数据库中不存在此字符串 id。所以这是必须即时生成的东西。有没有办法在映射 onModelCreating 中实现这一点?

我尝试使用 Hasconversion() 但到目前为止没有运气。

 public class Model
 {
   public long ModelId { get; set; }
   public string ModelIdString { get; set; }
   public decimal ModelValue { get; set; }
 }
public class ModelContext : DbContext
{
     protected override void OnModelCreating(ModelBuilder modelBuilder)
     {
         base.OnModelCreating(modelBuilder);

         //configure column names
         modelBuilder.Entity<Model>().ToTable("db_model", "user_dba");


         modelBuilder.Entity<Model>(p =>
         {
             p.Property(md => md.ModelId).HasColumnName("model_id");
             p.Property(md => md.ModelIdString).HasColumnName("model_id").HasConversion<string>();
             p.Property(md => md.ModelValue).HasColumnName("value");
          });
     }
}

标签: c#entity-framework.net-core

解决方案


我不建议仅仅因为客户应用程序的要求而对模型进行更改。
而是创建表示客户端应用程序所需的数据结构的专用类,并将数据库模型映射到客户端数据结构。

这会将数据库模型与客户需求隔离开来,让您可以自由地设计数据库而不依赖于客户需求。它还将保护您的模型免受客户端未来可能发生的变化。
例如,您可以只公开客户认为可以看到的字段,但隐藏对您自己的应用程序至关重要的字段。

public class Model
{
    public int Id { get; set; }
    public string Value { get; set; }
    public string SecretKey { get; set; } // "hidden" from the client
}

public class ClientModel
{
    public string Id { get; set; }
    public string Value { get; set; }
}

当您从数据库中检索模型时,将其映射到客户端模型

var clientModel = dbContext.Models
    .Where(model => model.Id = someId)
    .Select(model => new ClientModel
    {
        Id = model.Id.ToString(),
        Value = model.Value
    })
    .ToList();

或者您可以为模型创建扩展方法

public static ClientModel ToClientModel(this Model model)
{
    return new ClientModel
    {
        Id = model.Id.ToString(),
        Value = model.Value
    };
}

var clientModel = dbContext.Models
    .Where(model => model.Id = someId)
    .Select(model => model.ToClientModel())
    .ToList();

推荐阅读