System.NotSupportedException Невозможно сохранить тип: Library.Models.UserModel - PullRequest
0 голосов
/ 03 июля 2018

Я пишу программу UWP с БД SQLite. Программа использует универсальную библиотеку Windows, которая содержит статический класс, управляющий БД. В исключении Stack Trace я вижу все методы sqlite, даже если он не достигает точек останова, которые я установил в классе DB Manager.

Модель, на которой строится БД:

public class UserModel
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Password { get; set; }
    public bool Connected { get; set; }
}

Статический менеджер БД:

public static class UsersManager
{
    public static event EventHandler NewConnectionHandler=delegate { };

    private static string _path;
    private static SQLiteConnection _conn;

    static UsersManager()
    {
        _path = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "usersdb.sqlite");
        _conn = new SQLiteConnection(new SQLitePlatformWinRT(), _path);
        _conn.CreateTable<UserModel>();
    }

    private static void OnNewConnection()
    {
        NewConnectionHandler.Invoke(null, EventArgs.Empty);
    }

    public static void Add(UserModel user)
    {
        _conn.Insert(user);
    }

    public static void Delete(int userId)
    {
         _conn.Delete<UserModel>(userId);

    }

    public static bool Contains(string name)
    {
        bool flag = false;
        var user = _conn.Find<UserModel>(u => u.Name == name);

        if (user != null)
            flag = true;

        return flag;
    }

    public static void ConnectUser(UserModel connectedUser,HubConnection hubConnection ,IHubProxy hubProxy)
    {
        _conn.Find<UserModel>(connectedUser).Connected = true;
        _conn.Update(connectedUser);
        var queryStringData = new Dictionary<string, string>();
        queryStringData.Add("username", connectedUser.Name);

        hubConnection = new HubConnection("http://127.0.0.1:8080", queryStringData);
        hubProxy = hubConnection.CreateHubProxy("ChatHub");
        if (hubConnection.State != ConnectionState.Connected)
        {
            hubConnection.Start();
        }

        OnNewConnection();

    }

    public static ObservableCollection<UserModel> ConnectedUsers
    {
        get
        {
            var allUsers = _conn.Table<UserModel>();
            ObservableCollection<UserModel> disconnectedUsers = new ObservableCollection<UserModel>();
            ObservableCollection<UserModel> connectedUsers = new ObservableCollection<UserModel>();
            foreach (var user in allUsers)
            {
                if (user.Connected)
                    connectedUsers.Add(user);
            }

            return connectedUsers;
        }

    }

    public static ObservableCollection<UserModel> DisconnectedUsers
    {
        get
        {
            var allUsers = _conn.Table<UserModel>(); 
            ObservableCollection<UserModel> disconnectedUsers = new ObservableCollection<UserModel>();
            foreach (var user in allUsers)
            {
                if (!user.Connected)
                    disconnectedUsers.Add(user);
            }

            return disconnectedUsers;
        }

    }
}

, где возникает исключение:

private void SignIn(object sender, RoutedEventArgs e)
    {
        if (userViewModel.SignIn()) //here right after trying execute SignIn() 
        {
            Frame.Navigate(typeof(ContactsView), userViewModel);
        }
    }

Метод SignIn в UserViewModel:

public bool SignIn()
    {
        bool flag = false;
        if (Name == null || Password == null)
        {
            Error = "Name or password wasnt filled";
        }
        else if (UsersManager.Contains(Name) && !UserSettings.IsNameExict(Name))
        {
            Error = "Name already in use choose diffrent one";
        }
        else
        {
            UserModel user = new UserModel
            {
                Name = Name,
                Password = Password,
            };

            if (!UsersManager.Contains(Name))
            {
                UsersManager.Add(user);
                UserSettings.SaveUserName(Name);
            }

            UsersManager.ConnectUser(user,_hubConnection, _hubProxy);

            flag = true;
        }

        return flag;
    }

Надеюсь, вы, ребята, помогите мне, я действительно пытался найти ответ на этот вопрос. Спасибо

Редактировать 1:

Запустите программу еще раз сегодня, и кажется, что: программа выдает исключение в классе UsersManager следующим способом:

public static void ConnectUser(UserModel connectedUser,HubConnection hubConnection ,IHubProxy hubProxy)
    {


        _conn.Find<UserModel>(connectedUser).Connected = true;//In this line!!!



        _conn.Update(connectedUser);
        var queryStringData = new Dictionary<string, string>();
        queryStringData.Add("username", connectedUser.Name);

        hubConnection = new HubConnection("http://127.0.0.1:8080", queryStringData);
        hubProxy = hubConnection.CreateHubProxy("ChatHub");
        if (hubConnection.State != ConnectionState.Connected)
        {
            hubConnection.Start();
        }

        OnNewConnection();

    }

1 Ответ

0 голосов
/ 03 июля 2018

Ошибка при отправке экземпляра UserModel в метод SQLiteConnection.Find<>.

Метод find работает с pk таблицы, поэтому

Неправильно:

_conn.Find<UserModel>(connectedUser);

правый:

_conn.Find<UserModel>(connectedUser.Id);

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

_conn.Find<UserModel>(u=>u.Name == connectedUser.Name);
...