Skip to content

Instantly share code, notes, and snippets.

@gistlyn
Last active November 10, 2020 13:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gistlyn/1a2966dc699940e0688cf4863f0b629b to your computer and use it in GitHub Desktop.
Save gistlyn/1a2966dc699940e0688cf4863f0b629b to your computer and use it in GitHub Desktop.
Create Tables with Foreign Keys
using System;
using ServiceStack;
using ServiceStack.Text;
using ServiceStack.OrmLite;
using ServiceStack.OrmLite.Sqlite;
using ServiceStack.DataAnnotations;
var dbFactory = new OrmLiteConnectionFactory(":memory:", SqliteDialect.Provider);
var db = dbFactory.Open();
public class Artist
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Album
{
public int Id { get; set; }
public string Name { get; set; }
[ForeignKey(typeof(Album), OnDelete = "CASCADE")]
public int ArtistId { get; set; }
}
public class Track
{
public int Id { get; set; }
public string Name { get; set; }
[References(typeof(Album))]
public int AlbumId { get; set; } // db-agnostic attribute, generates FK to Artist
[ForeignKey(typeof(Artist), OnDelete = "CASCADE")]
public int ArtistId { get; set; }
}
db.CreateTable<Artist>();
db.CreateTable<Album>();
db.CreateTable<Track>(); //Order is important for tables with Foreign Keys
var createTableDefinition = db.GetLastSql();
createTableDefinition.Print();
db.Insert(new Artist { Id = 1, Name = "Nirvana" });
db.Insert(new Album { Id = 2, Name = "Nevermind", ArtistId = 1 });
db.Insert(new Track { Id = 3, Name = "Smells Like Teen Spirit", AlbumId = 2, ArtistId = 1 });
var artist = db.SingleById<Artist>(1);
var album = db.SingleById<Album>(2);
var track = db.SingleById<Track>(3);
var artistTracksAndAlbum = new { artist, album, track };
$"Artist, Album + Tracks: {artistTracksAndAlbum.Dump()}".Print();
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="System.Memory" version="4.5.4" targetFramework="net45" />
<package id="ServiceStack.Text" version="5.10.0" targetFramework="net45" />
<package id="ServiceStack.Client" version="5.10.0" targetFramework="net45" />
<package id="ServiceStack.Common" version="5.10.0" targetFramework="net45" />
<package id="ServiceStack.Interfaces" version="5.10.0" targetFramework="net45" />
<package id="ServiceStack.OrmLite" version="5.10.0" targetFramework="net45" />
<package id="ServiceStack.OrmLite.Sqlite.Windows" version="5.10.0" targetFramework="net45" />
</packages>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment