using System.ComponentModel.DataAnnotations;
using Faithlife.FakeData;
public sealed class UserRecord
public long UserId { get; set; }
[Required, StringLength(100)]
public string Name { get; set; } = "";
[RegularExpression(@"^[a-zA-Z0-9_]+$")]
public string? Alias { get; set; }
public sealed class UserRoleRecord
public long UserRoleId { get; set; }
public long UserId { get; set; }
public int Role { get; set; }
public sealed class UserDatabaseContext : FakeDatabaseContext
public UserDatabaseContext()
Users = CreateTable<UserRecord>();
UserRoles = CreateTable<UserRoleRecord>();
public FakeDatabaseTable<UserRecord> Users { get; }
public FakeDatabaseTable<UserRoleRecord> UserRoles { get; }
public static void Main()
var database = FakeDatabase.Create<UserDatabaseContext>();
using var context = database.Lock();
var alice = context.Users.Add(new UserRecord { Name = "Alice", Alias = "4l1c3" });
var bob = context.Users.Add(new UserRecord { Name = "Bob", Alias = "b0b" });
context.UserRoles.AddRange(new[]
new UserRoleRecord { UserId = alice.UserId, Role = 1 },
new UserRoleRecord { UserId = bob.UserId, Role = 2 },
new UserRoleRecord { UserId = bob.UserId, Role = 1 },
Console.WriteLine("Bob has ID {0}", bob.UserId);
var aliases = context.Users.Select(x => x.Alias).Distinct();
Console.WriteLine("Aliases: {0}", string.Join(", ", aliases));
from user in context.Users
join role in context.UserRoles on user.UserId equals role.UserId
Console.WriteLine("Names with role 2: {0}", string.Join(", ", namesWithRoleTwo));
int updated = context.Users.UpdateWhere(x => x.UserId == bob.UserId, x => x.Name = "Robert");
Console.WriteLine("{0} records updated.", updated);
int removed = context.Users.RemoveWhere(x => x.UserId == bob.UserId);
Console.WriteLine("{0} records removed.", removed);