我可以使用部分类来确定数据模型如何在.Net Core 2.0 API

时间:2018-01-22 22:47:41

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

我使用 dotnet ef scaffold 从现有数据库生成模型类 的" Microsoft.EntityFrameworkCore.Tools"

一切正常,模型按照预期生成数据注释,asp.net控制器返回Json没有问题。

使用[JsonIgnore]装饰器有助于删除我不希望api返回的字段。 (比如Id等)

我想使用一个部分类,当你搭建一个新的DbContext时不会被覆盖。(如果它可以在另一个程序集中,则可以获得奖励) Newtonsoft让我处理空值,日期和引用循环 - 我希望所有的好处与EF的所有注释分开。

我知道还有其他技术,但这似乎是Partial类的一个很好的用例...就像ASP.Net MVC附带的jQuery不引人注目的验证一样......但我已经点击了这个问题上的障碍......所以这甚至是可能的,或者我错过了一些明显的东西:|

实体框架生成的模型

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Newtonsoft.Json;

namespace SomeNamespace
{
    public partial class Media
    {
        public int Id { get; set; }

        public int SiteId { get; set; }

        public Guid Ref { get; set; }

        [Required]
        [StringLength(2000)]
        public string Url { get; set; }

        public string Caption { get; set; }

        [ForeignKey("SiteId")]
        [InverseProperty("Media")]
        public Site Site { get; set; }
    }
}

部分班级

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;    
using Microsoft.AspNetCore.Mvc; // "ModelMetadataType"
using Newtonsoft.Json;

namespace SomeNamespace
{
    [ModelMetadataType(typeof(MediaMetaData))]
    public partial class Media
    {
    }
    public partial class MediaMetaData
    {
        [JsonIgnore]
        public int Id { get; set; }

        [JsonIgnore]
        public int SiteId { get; set; }

        [JsonIgnore]
        public Site Site { get; set; }
    }
}

:( =>更新:2018年1月23日

我收到了这个答案的评论How to use ASP.Net core ModelMetadata attribute

  

"因为您正在尝试使用派生类的元数据类型   重命名基本类型"

中的属性

我可以欣赏Liskov,但后来是Partial Class实际上是一个派生类??

我不能的是[JsonIgnore]在EF模型中的应用效果如此......

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;    
using Microsoft.AspNetCore.Mvc; // "ModelMetadataType"
using Newtonsoft.Json;

namespace SomeNamespace
{
    public partial class Media
    {
        [JsonIgnore]
        public int Id { get; set; }

        [JsonIgnore]
        public int SiteId { get; set; }

        public Guid Ref { get; set; }

        [Required]
        [StringLength(2000)]
        public string Url { get; set; }

        public string Caption { get; set; }

        [JsonIgnore]
        [ForeignKey("SiteId")]
        [InverseProperty("Media")]
        public Site Site { get; set; }
    }
}

并产生以下内容......

{
  "ref": "0c0e1475-63a1-41ce-9c6f-b4be6afd516a",
  "url": "https://drive.com/images/fb65a200",
  "caption": "bla bla"
}

它是我想要的......但是在使用代码生成时会被覆盖(部分类应该解决的问题

但是通过使用上面的原始问题中的部分类,我得到了这个......

{
  "id": 7,
  "siteId": 2000,
  "ref": "0c0e1475-63a1-41ce-9c6f-b4be6afd516a",
  "url": "https://drive.com/images/fb65a200",
  "caption": "bla bla",
  "site": {...}
}

0 个答案:

没有答案