在ServiceStack ORMLite上使用Identity 列插入多表的最佳方法

本文关键字:插入 方法 最佳 Identity ORMLite ServiceStack | 更新日期: 2023-09-27 17:56:15

>昨天我发现了这个很棒的ORM,并希望对比github上提供的示例更复杂的东西进行一些测试。

这是我正在使用的模型

class BaseClass
{
    [AutoIncrement]
    public int Id { get; set; }
    [StringLength(200)]
    public string Name { get; set; }
}
[Alias("artist")]
class Artist : BaseClass
{
}
[Alias("genre")]
class Genre : BaseClass
{
}
[Alias("artistgenre")]
class ArtistGenre
{
    [PrimaryKey]
    public int Id { get; set; }
    [Alias("idgenre")]
    [References(typeof(Genre))]
    public int IdGenre { get; set; }
    [Alias("idartist")]
    [References(typeof(Artist))]
    public int IdArtist { get; set; }
}

这就是我想要实现的目标(尽管它不起作用,因为在插入艺术家流派表时身份值未知)。

                if (dbConn.TableExists("artistgenre"))
                    dbConn.DropTable<ArtistGenre>();
                if (dbConn.TableExists("artist"))
                    dbConn.DropTable<Artist>();
                if (dbConn.TableExists("genre"))
                    dbConn.DropTable<Genre>();
                dbConn.CreateTables(false, typeof(Artist), typeof(Genre), typeof(ArtistGenre));
                var genres = new List<Genre>();
                genres.Add(new Genre() { Name = "Rock" });
                genres.Add(new Genre() { Name = "Pop" });
                genres.Add(new Genre() { Name = "Jazz" });
                genres.Add(new Genre() { Name = "Classic" });
                genres.Add(new Genre() { Name = "Bossanova" });
                var artists = new List<Artist>();
                artists.Add(new Artist() { Name = "Rush" });
                artists.Add(new Artist() { Name = "Queen" });
                artists.Add(new Artist() { Name = "Pat Metheny" });
                var ag = new List<ArtistGenre>();
                var a = artists.FirstOrDefault(c => c.Name == "Rush");
                var g = genres.FirstOrDefault(c => c.Name == "Rock");
                ag.Add(new ArtistGenre() { IdArtist = a.Id, IdGenre = g.Id });
                dbConn.SaveAll<Artist>(artists);
                dbConn.SaveAll<Genre>(genres);
                dbConn.SaveAll<ArtistGenre>(ag);

除了添加每一行并获取其标识值之外,是否有简单的解决方案?

谢谢。

在ServiceStack ORMLite上使用Identity 列插入多表的最佳方法

OrmLite 目前没有使用自动递增的 id atm 填充模型。获取自动增量 ID 的方法是在每次插入后使用 db.GetLastInsertId(),例如:

artists.ForEach(artist => {
  db.Insert(artist);
  artist.Id = db.GetLastInsertId();
});

我建议将其包装在扩展方法中,以使其更好使用。