我有一个具有ID,用户名和等级的Player类:
class Player
{
public int Id { get; set; }
public string Username { get; set; }
public Rank Rank { get; set; }
}
我想在SQLite数据库中插入一个新播放器,为此,我正在使用Dapper。
在表单按钮上按:
Player newPlayer = new Player();
Rank newRank = new Rank();
newPlayer.Username = txtUsername.Text;
newPlayer.Rank = newRank;
if (newPlayer.Username != null && newPlayer.Username != String.Empty)
{
SQLiteDataAccess.SavePlayer(newPlayer);
Close();
}
“ SQLiteDataAccess”中的 C RUD方法
public static void SavePlayer(Player player)
{
using (IDbConnection connection = new SQLiteConnection(LoadConnectionString()))
{
connection.Execute("insert into Players (Username, Rank) values (@Username, @Rank)",
player);
}
}
当我使用此自定义“ Rank”类型作为参数时出现问题:
System.NotSupportedException:'类型为Prototype1.Rank的成员等级 不能用作参数值'
有没有解决的办法,还是没有使用Dapper的另一种办法?
答案 0 :(得分:3)
首先,使用string.IsNullOrEmpty()
而不是if (newPlayer.Username != null && newPlayer.Username != String.Empty)
。
Dapper本身不执行这种插入。您需要先添加等级类,然后将ID绑定到Player类中的值类型RankID。例如:
public class Player
{
public int Id { get; set; }
public string Username { get; set; }
public int RankId { get; set; }
public Rank Rank { get; set; }
}
public class Rank
{
public int Id { get; set; }
public string Something { get; set; }
}
public class Repo
{
public void Save(Player player)
{
// .. open connection
player.RankId = connection.ExecuteScalar<int>("insert into Rank (Something) values (@Something)", player.Rank);
player.Id = connection.ExecuteScalar<int>("insert into Player (Username, RankId) values (@Username, @RankId", player);
}
}
答案 1 :(得分:2)
使用Dapper插入表时,只能将基本类型用作参数。
您至少有以下选择:
a)如果Player-Rank-relationship是一对一的,则可以重构类模型,以便Player-class包含Rank-class中的所有字段,然后删除Rank类。您也可以修改插入子句以仅插入具有原始类型的单个Players行。
b)如果Player-Rank-relation是One [Player] -to-Many [Ranks],则可以通过以下方式重构解决方案:首先插入Rank(到它自己的表中,包含PlayerId作为外键),然后插入具有是领域。