我正在使用带有 Web API 的 Code-First 实体框架。我需要从 fiddler 发送针对控制器中的 post 方法的测试模型对象。 该模型具有以下参数:
[Key]
public int ID { get; set; }
public string Caption { get; set; }
[JsonIgnore]
public byte[] Image { get; set; }
[NotMapped]
public string ImageDataString { get; set; }
ImageDataString 是我的图像的字符串表示形式。它不应该成为数据库中的一列;因此,它被标记为NotMapped。当我进行转换时,它的目的就结束了:
protected override UserImage CreateEntity(UserImage entity)
{
entity.Image = Convert.FromBase64String(entity.ImageDataString);
因为从客户端传递字符串而不是 byte[] 更容易。
现在的目标是能够模拟从 fiddler 发送实体对象。因为属性未映射,所以实体显示为空。如果我删除 [NotMapped] 标签,实体对象将被很好地填充。
这是我的提琴手在撰写中的正文信息:
{ "Caption":"你好世界", “ImageDataString”:“/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCkkR1N/DVrd6ikBgtNZtv9H1SxAWUJsnX5mVGGZZdSxtB0anyfZ9z7TgLjnH8J5” }
如何结合使用 NotMapped 来停止在数据库中创建列,但同时仍然能够在发布过程中使用它? EF 本质上不可能吗?你还有什么建议?
我建议您的实体仅保存要进入数据库的字段。
创建一个单独的视图模型以发送到视图,其中您具有 imagedatastring 属性。如果你愿意,你甚至可以让它继承实际的实体。
所以最好不要使用实体模型作为请求或响应模型, 但在这种情况下,也许尝试在 DbContext 类中尝试使用 Fluent API,而不是处理 [NotMapped] 属性。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<YourEntityName>().Ignore(x => x.ImageDataString);
}
然后您可以删除 NotMapped 属性。