保留对数据库的复杂用户首选项

时间:2018-08-20 15:59:03

标签: javascript c# asp.net-web-api

对于我们各个部分,我们都有一种复杂的用户偏好结构 网站。由于这个事实,我将它们作为json字符串存储在单个列中。它也可以是一个文件。

我有各种更新方法,负责更新设置的特定部分。

我有两个问题:

我将它们保留为json的方法是否正确?我不能(或可能不想)弄平设置,因为设置太多了,它们可能会增加时间。

我应该如何处理两个请求同时出现的情况,这些请求会更新设置的相同部分。

仅举一个例子,这些设置之一提供了图像图块的源提供者。有几块瓷砖,所以我有这样的东西:

public class UserSettings
{
    public List<string> Providers {get;set;} = new List<string>();
}

在客户端,每个磁贴将从该列表中获取提供者,或默认为'provider1'。

在某个时候,我需要将指向“ provider2”的图块重置为现在再次指向“ provider1”的图块。

每个图块都负责将其状态推送到服务器,因此它们具有如下方法(其中index是图块的索引):

let updateImageTileSettings = function (provider) {
    let index = this.index;

    let images = [];

    images[index] = provider;

    return $.ajax({
        url: userApi + '/UpdateImageTileSettings',
        type: 'PUT',
        data: { tiles: images }
    });
}

在服务器上,我有一个带有如下端点的ApiController:

    [HttpPut]
    public async Task<UserModel> UpdateImageTileSettings(JObject input)
    {

        var tiles = input["tiles"].ToObject<List<string>>();
        int userId = User.Identity.GetUserId<int>();
        var user = await _applicationUserApi.FindEntityAsync(userId);

        var settings = user.Settings ?? new UserSettings();

        for(var i=0;i<=tiles.Count() - 1; i++)
        {
            if (settings.Providers .Count() < i + 1)
            {
                settings.Providers .Add(tiles[i]);
            }
            else
            {
                if (!String.IsNullOrWhiteSpace(tiles[i]))
                {
                    settings.Providers [i] = tiles[i];
                }
            }
        }
        BackgroundJob.Enqueue<IApplicationUserApi>(x => x.UpdateUserPreferences(userId, settings));

        return GetModel(user);
    }

因此,发生的事情是每次希望更新磁贴提供程序时,它将从数据库获取设置,更新此单个磁贴并推送到数据库。问题是在这种情况下,我想同时更新多个图块(多个请求一起出现),那么它们将从数据库中获取当前设置,而现在它们都具有相同的当前设置。它们中的每个仅更新自身,保留其余值,并推送到数据库。因此,发生的情况是最后一个服务将放弃所有先前的更改,而仅保留它所服务的更改。

任何想法都将不胜感激。

0 个答案:

没有答案