Entity Framework Core хранит сущность вне контекста БД в памяти - PullRequest
0 голосов
/ 25 апреля 2019

Я создаю игровой сервер с помощью консольного приложения dotnet core 2.2, у меня есть некоторое недопонимание о том, как работает структура сущностей в определенных senarios.Я хочу хранить пользовательскую информацию в памяти, но с учетом двух важных факторов.

  1. Я хочу, чтобы данные постоянно обновлялись
  2. Я хочу сделать минимальное количество запросов к базе данных

Вот способВ настоящее время я делаю это:

DatabaseManager.cs

internal static class DatabaseManager
{
    public static async Task<User> FindUser(int userId, string token)
    {
        using (var dbContext = new musicContext())
        {
            return await dbContext.User.FirstOrDefaultAsync(u =>
                u.UserId == userId && string.Equals(u.Token, token, StringComparison.InvariantCulture));
        }
    }

    public static IEnumerable<Game> GetUserGames(User user)
    {
        using (var dbContext = new musicContext())
        {
            return dbContext.Game
                .Include(g => g.ParticipantOneNavigation)
                .Include(g => g.ParticipantTwoNavigation)
                .Where(g =>
                    g.ParticipantOneNavigation == user || g.ParticipantTwoNavigation == user);
        }
    }
}

Player.cs

internal class Player : IEquatable<Player>
{
    private readonly NetPeer _netPeer;
    private User _user;
    private int _userId;
    private string _token;

    public Player(NetPeer netPeer)
    {
        _netPeer = netPeer;
    }

    public async Task<bool> Authenticate(int userId, string token)
    {
        _user = await DatabaseManager.FindUser(userId, token);

        if (_user is null)
            return false;

        _userId = userId;
        _token = token;

        return true;
    }

    public NetPeer GetPeer()
    {
        return _netPeer;
    }

    public int GetPlayerId()
    {
        FlushData();

        return _user.UserId;
    }

    public string GetUsername()
    {
        FlushData();

        return _user.Username;
    }

    public string GetNickname()
    {
        FlushData();

        return _user.Nickname;
    }

    public string GetPhoneNumber()
    {
        FlushData();

        return _user.PhoneNumber;
    }

    public int GetCoins()
    {
        FlushData();

        return _user.Coins;
    }

    public int GetCups()
    {
        FlushData();

        return _user.Cups;
    }

    public bool IsAuthenticated()
    {
        return _user != null;
    }

    public bool IsSuspended(out DateTimeOffset suspendedUntil)
    {
        suspendedUntil = _user.SuspendedUntil.GetValueOrDefault();

        return _user.Suspended;
    }

    public bool Equals(Player other)
    {
        if (ReferenceEquals(null, other)) return false;
        if (ReferenceEquals(this, other)) return true;
        return _playerId == other._playerId;
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        return obj.GetType() == GetType() && Equals((Player)obj);
    }

    public override int GetHashCode()
    {
        return _playerId;
    }

    private async void FlushData()
    {
        _user = await DatabaseManager.FindUser(_userId, _token);
    }
}

Isэто оптимальный способ сделать это?Если нет, что вы можете предложить, чтобы сделать его лучше?

1 Ответ

0 голосов
/ 25 апреля 2019

Вы не можете сделать это, потому что база данных предназначена для сохранения данных, и частые запросы неизбежны для постоянного обновления данных.

Если вам требуется средство обмена информацией в режиме реального времени, вам нужноразработать и запустить приложение на стороне сервера с двусторонней связью (например, UDP, TCP, WebSocket. А что касается .NET Core, рекомендуется ASP.NET Core SignalR.), которое может кэшировать, уведомлять и отправлять обновления данных вклиентов.Чтобы сохранить данные, вы можете периодически обновлять базу данных из кэша через приложение на стороне сервера.Это также может принести пользу целостности и безопасности бизнес-данных.

...