Как перестать получать дубликаты данных в Web API 2 - PullRequest
0 голосов
/ 07 марта 2019

Я хочу разработать RESTfull API, в котором нет дублирующих данных. Вот мой контекстный класс

public class ReviewDbContext : DbContext
{
    public ReviewDbContext() : base("name=Con")
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<ReviewDbContext, ReviewsCalculateSystem.Models.Migrations.Configuration>("Con"));
        this.Configuration.LazyLoadingEnabled = false;
        //this.Configuration.ProxyCreationEnabled = false;
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
    }
    private void FixEfProviderServicesProblem()
    {
        var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
    }
    //Here some entity....
}

Я сталкиваюсь с этой ошибкой:

Типу ObjectContent`1 не удалось сериализовать тело ответа для типа контента application / xml; кодировка = UTF-8' .

И эта ошибка решена, чтобы добавить следующий код в мой файл Global.asax

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
            .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        GlobalConfiguration.Configuration.Formatters
            .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

reviewerReviewForEachProductById класс обслуживания

 public JsonResult reviewerReviewForEachProductById(int reviewerId, int productId)
    {
        var productReviewInfo = db.ReviewerTaskAsigns.Where(x => x.ReviewerId == reviewerId && x.ProductId == productId).Select(x => new { x.Product, x.ReviewCollectMargin, x.NumberOfReviewCollect }).FirstOrDefault();
        //var reviewList = db.Reviews.Where(x => x.ReviewerId == reviewerId && x.ProductId == productId).ToList();
        return new JsonResult
        {
            Data = new{productReviewInfo},
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
    }

Когда я нажимаю на вышеупомянутую службу, используя Почтальон enter image description here

В приведенном выше классе обслуживания я добавляю дополнительный код, чтобы что-то сделать, и извлекаю вышеуказанную ошибку, которую я решил

public JsonResult reviewerReviewForEachProductById(int reviewerId, int productId)
    {
        var productReviewInfo = db.ReviewerTaskAsigns.Where(x => x.ReviewerId == reviewerId && x.ProductId == productId).Select(x => new { x.Product, x.ReviewCollectMargin, x.NumberOfReviewCollect }).FirstOrDefault();
        var reviewList = db.Reviews.Where(x => x.ReviewerId == reviewerId && x.ProductId == productId).ToList();
        return new JsonResult
        {
            Data = new{
                productReviewInfo,
                reviewList
            },
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
    }

Когда я обращаюсь к вышеуказанному сервису с помощью почтальона, я вижу много повторяющихся данных здесь

{
"productReviewInfo": {
    "Product": {
        "Admin": null,
        "ReviewerTaskAsigns": null,
        "Reviews": [
            {
                "Reviewer": null,
                "ReviewId": 3,
                "SwapmeetFbProfileLink": "B1",
                "SwapmeetProductLink": "B1",
                "SwapmeetReviewLink": "B1",
                "OwnReviewLink": null,
                "ReviewStatus": true,
                "isPay": false,
                "ProductId": 4,
                "ReviewerId": 1
            }
        ],
        "ProductId": 4,
        "ProductName": "C# Book",
        "ProductAsin": "64dFDF45F",
        "ProductLink": "https://www.amazon.com/Healthy-Meal-Prep-Cookbook-Wholesome-ebook/dp/B07492912F/ref=sr_1_1_sspa?s=digital-text&ie=UTF8&qid=1549435615&sr=1-1-spons&keywords=keto+meal+prep&psc=1",
        "CurrentStatus": true,
        "NumberOfReviewNeed": 30,
        "NumberOfReviewCollect": null,
        "ReviewStartDate": "2019-02-08T00:00:00",
        "ReviewEndDate": null,
        "AdminId": 1
    },
    "ReviewCollectMargin": 20,
    "NumberOfReviewCollect": 1
},
"reviewList": [
    {
        "Product": {
            "Admin": null,
            "ReviewerTaskAsigns": null,
            "Reviews": [],
            "ProductId": 4,
            "ProductName": "C# Book",
            "ProductAsin": "64dFDF45F",
            "ProductLink": "https://www.amazon.com/Healthy-Meal-Prep-Cookbook-Wholesome-ebook/dp/B07492912F/ref=sr_1_1_sspa?s=digital-text&ie=UTF8&qid=1549435615&sr=1-1-spons&keywords=keto+meal+prep&psc=1",
            "CurrentStatus": true,
            "NumberOfReviewNeed": 30,
            "NumberOfReviewCollect": null,
            "ReviewStartDate": "2019-02-08T00:00:00",
            "ReviewEndDate": null,
            "AdminId": 1
        },
        "Reviewer": null,
        "ReviewId": 3,
        "SwapmeetFbProfileLink": "B1",
        "SwapmeetProductLink": "B1",
        "SwapmeetReviewLink": "B1",
        "OwnReviewLink": null,
        "ReviewStatus": true,
        "isPay": false,
        "ProductId": 4,
        "ReviewerId": 1
    }
]

}

Модель продукта и обзор класса

 public class Product
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public string ProductAsin { get; set; }
    public string ProductLink { get; set; }
    public bool CurrentStatus { get; set; }
    public int NumberOfReviewNeed { get; set; }
    public int? NumberOfReviewCollect { get; set; }
    public DateTime? ReviewStartDate { get; set; }
    public DateTime? ReviewEndDate { get; set; }
    public int AdminId { get; set; }
    public virtual Admin Admin { get; set; }
    public virtual ICollection<Review> Reviews { get; set; }
    public virtual ICollection<ReviewerTaskAsign> ReviewerTaskAsigns { get; set; }

}

public class Review
{
    public int ReviewId { get; set; }
    public string SwapmeetFbProfileLink { get; set; }
    public string SwapmeetProductLink { get; set; }
    public string SwapmeetReviewLink { get; set; }
    public string OwnReviewLink { get; set; }
    public bool ReviewStatus { get; set; }
    public bool isPay { get; set; }
    public int ProductId { get; set; }
    public virtual Product Product { get; set; }
    public int ReviewerId { get; set; }
    public virtual Reviewer Reviewer { get; set; }
}

Как остановить выборку дублированных данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...