C# System.NotSupportedException无法存储类型:Library.Models.UserModel
我正在用SQLite DB编写uwp程序。该程序使用一个通用windows库,其中包含一个控制DB的静态类。在异常堆栈跟踪中,我看到了sqlite的所有方法,即使它没有到达我在DB Manager类中放置的断点 数据库构建所基于的模型: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
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时,代码正在运行。因此,我不认为简化代码就能解决错误。