无法在Dapper查询中使用自定义类型作为参数插入SQLite数据库

时间:2019-03-16 17:55:53

标签: c# database sqlite dapper

我有一个具有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”类由一个字符串名称和一些整数组成。我有一个构造函数,将它们全部设置为默认值“-”和0。

当我使用此自定义“ Rank”类型作为参数时出现问题:

  

System.NotSupportedException:'类型为Prototype1.Rank的成员等级   不能用作参数值'

有没有解决的办法,还是没有使用Dapper的另一种办法?

2 个答案:

答案 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作为外键),然后插入具有是领域。