C# System.NotSupportedException无法存储类型:Library.Models.UserModel

C# System.NotSupportedException无法存储类型:Library.Models.UserModel,c#,sqlite,dll,uwp,windows-10-universal,C#,Sqlite,Dll,Uwp,Windows 10 Universal,我正在用SQLite DB编写uwp程序。该程序使用一个通用windows库,其中包含一个控制DB的静态类。在异常堆栈跟踪中,我看到了sqlite的所有方法,即使它没有到达我在DB Manager类中放置的断点 数据库构建所基于的模型: public class UserModel { [PrimaryKey, AutoIncrement] public int Id { get; set; } public string Name { get; set; } p

我正在用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;
        }

    }
}
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:

_conn.Find<UserModel>(connectedUser.Id);
今天再次运行该程序,看起来:该程序在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();

    }
publicstaticvoidconnectuser(usermodelconnecteduser、HubConnection-HubConnection、IHubProxy-hubProxy)
{
_conn.Find(connectedUser).Connected=true;//在此行中!!!
_连接更新(连接用户);
var queryStringData=new Dictionary();
添加(“用户名”,connectedUser.Name);
轮毂连接=新轮毂连接(“http://127.0.0.1:8080“,查询字符串数据);
hubProxy=hubConnection.CreateHubProxy(“ChatHub”);
if(hubConnection.State!=ConnectionState.Connected)
{
hubbonnection.Start();
}
OnNewConnection();
}

问题是将UserModel实例发送到
SQLiteConnection.Find
方法

find方法与表的pk一起工作,因此

错误:

_conn.Find<UserModel>(connectedUser);
\u连接查找(connectedUser);
右侧:

_conn.Find<UserModel>(connectedUser.Id);
\u连接查找(connectedUser.Id);
它还可以基于模型的任何其他属性获取lambda表达式:

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

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