c# - 将 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");
});
}
}
解决方案
我不建议仅仅因为客户应用程序的要求而对模型进行更改。
而是创建表示客户端应用程序所需的数据结构的专用类,并将数据库模型映射到客户端数据结构。
这会将数据库模型与客户需求隔离开来,让您可以自由地设计数据库而不依赖于客户需求。它还将保护您的模型免受客户端未来可能发生的变化。
例如,您可以只公开客户认为可以看到的字段,但隐藏对您自己的应用程序至关重要的字段。
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();
推荐阅读
- javascript - OAuth2 - 如何在没有客户端密码的情况下进行授权?
- sql - 使用 Sql Query 以格式化方式获取用户数据
- javascript - 有没有更简洁的方法来获取我的网址中的最后一个数字?
- jquery - 如果我使用 Ajax 进行 http 请求,curl `-u` 可以转换成什么?
- forms - Typo3 没有为新的 FrontendForms 找到模板
- c - 在c中创建的数组不为空?
- android - Android从网页网址设置自定义字体
- swift - 带有 snapkit 的垂直居中 UIImageView
- javascript - javascript比较两个对象并打印值
- modelica - 如何将 PDEmodelica 用于 2D?