【问题标题】:System.NotSupportedException Cannot store type: Library.Models.UserModelSystem.NotSupportedException 无法存储类型:Library.Models.UserModel
【发布时间】:2018-12-11 03:22:48
【问题描述】:

我正在用 SQLite DB 编写 uwp 程序。该程序使用一个通用的 Windows 库,该库包含一个控制 DB 的静态类。在异常堆栈跟踪中,我看到了 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);
        }
    }

UserViewModel 中的 SignIn 方法:

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();

    }

【问题讨论】:

  • 错误是什么,UserModels 是什么样的?您可能需要简化代码以发布重现,这样做可能会为您解决问题。
  • @PeterTorr-MSFT 本文标题中指定的错误:System.NotSupportedException 无法存储类型:Library.Models.UserModel。 UserModel 看起来就像我将它放在第一个代码部分下的方式。并且代码很简单 MVVM 我将其全部发布。事实上,当我使用 UserModel 集合而不是 sqlite 时,代码正在运行。所以,我认为简化代码并不能解决错误。

标签: c# sqlite dll uwp windows-10-universal


【解决方案1】:

问题是将 UserModel 实例发送到 SQLiteConnection.Find&lt;&gt; 方法。

find方法对表的pk有效,所以

错误:

_conn.Find<UserModel>(connectedUser);

右:

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

它还可以根据模型的任何其他属性获取 lambda 表达式:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多