【问题标题】:Can't use custom type as parameter in Dapper query to insert into SQLite Database不能在 Dapper 查询中使用自定义类型作为参数插入 SQLite 数据库
【发布时间】:2019-03-16 17:55:53
【问题描述】:

我有一个 Player 类,它有一个 Id、用户名和等级:

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”中的CRUD方法

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 类型的成员 Rank 不能用作参数值'

有没有办法解决这个问题,或者不使用 Dapper 的其他方法?

【问题讨论】:

    标签: c# database sqlite dapper


    【解决方案1】:

    首先,使用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);
        }
    }
    

    【讨论】:

    • 啊,是的,我明白了。我以前对用户/产品做过这种类型的事情,所以我不明白为什么我不能在这里应用它,无论如何我以后都需要能够查看某些等级内的玩家,所以这是最好的解决方案。
    【解决方案2】:

    使用 Dapper 插入表时,您只能使用原始类型作为参数。

    您至少有以下选择:

    a) 如果 Player-Rank-relation 是一对一的,您可以重构您的类模型,以便 Player-class 包含您的 Rank-class 中的所有字段,然后删除您的 Rank 类。您还可以修改您的 insert-clause 以仅插入到具有原始类型的单个 Players-row。

    b) 如果 Player-Rank-relation 是 One[Player]-to-Many[Ranks],您可以通过首先插入 Rank(到它自己的表,包含 PlayerId 作为外键)然后使用 Player 对象来重构您的解决方案这是字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2012-01-15
      • 2018-07-02
      相关资源
      最近更新 更多