DynamoDB CRUD Operations in C#
Perform type-safe Create, Read, Update, and Delete operations on DynamoDB using FluentDynamoDB. This guide demonstrates the three API patterns available: Lambda/Fluent (recommended), String Formatted, and Manual Builder.
- Lambda/Fluent
- String Formatted
- Manual Builder
Create (Put)
var user = new User
{
UserId = "user123",
Email = "john@example.com",
Name = "John Doe"
};
// Simple put
await table.Users.PutAsync(user);
// Conditional put (prevent overwrite)
await table.Users.Put(user)
.Where(x => x.UserId.AttributeNotExists())
.PutAsync();
Read (Get)
// Simple get
var user = await table.Users.GetAsync("user123");
// Get with composite key
var order = await table.Orders.GetAsync("customer123", "order456");
// Consistent read
var response = await table.Users.Get("user123")
.UsingConsistentRead()
.GetItemAsync();
Update
// Update specific attributes
await table.Users.Update("user123")
.Set(x => new UserUpdateModel
{
Name = "Jane Doe",
UpdatedAt = DateTime.UtcNow
})
.UpdateAsync();
// Conditional update
await table.Users.Update("user123")
.Where(x => x.Status == "active")
.Set(x => new UserUpdateModel { Name = "Jane Doe" })
.UpdateAsync();
// Increment a counter
await table.Users.Update("user123")
.Set(x => new UserUpdateModel { LoginCount = x.LoginCount.Add(1) })
.UpdateAsync();
Delete
// Simple delete
await table.Users.DeleteAsync("user123");
// Conditional delete
await table.Users.Delete("user123")
.Where(x => x.Status == "inactive")
.DeleteAsync();
// Delete with composite key
await table.Orders.DeleteAsync("customer123", "order456");
Create (Put)
var user = new User
{
UserId = "user123",
Email = "john@example.com",
Name = "John Doe"
};
// Simple put
await table.Users.PutAsync(user);
// Conditional put (prevent overwrite)
await table.Users.Put(user)
.Where($"attribute_not_exists({User.Fields.UserId})")
.PutAsync();
Read (Get)
// Simple get
var user = await table.Users.GetAsync("user123");
// Get with composite key
var order = await table.Orders.GetAsync("customer123", "order456");
// Get with projection
var response = await table.Users.Get("user123")
.WithProjection($"{User.Fields.Name}, {User.Fields.Email}")
.GetItemAsync();
Update
// Update specific attributes
await table.Users.Update("user123")
.Set($"SET {User.Fields.Name} = {{0}}, {User.Fields.Email} = {{1}}",
"Jane Doe",
"jane@example.com")
.UpdateAsync();
// Conditional update
await table.Users.Update("user123")
.Where($"{User.Fields.Status} = {{0}}", "active")
.Set($"SET {User.Fields.Name} = {{0}}", "Jane Doe")
.UpdateAsync();
// Increment a counter
await table.Users.Update("user123")
.Set($"ADD {User.Fields.LoginCount} {{0}}", 1)
.UpdateAsync();
Delete
// Simple delete
await table.Users.DeleteAsync("user123");
// Conditional delete
await table.Users.Delete("user123")
.Where($"{User.Fields.Status} = {{0}}", "inactive")
.DeleteAsync();
// Delete with composite key
await table.Orders.DeleteAsync("customer123", "order456");
Create (Put)
var user = new User
{
UserId = "user123",
Email = "john@example.com",
Name = "John Doe"
};
// Simple put
await table.Users.PutAsync(user);
// Conditional put (prevent overwrite)
await table.Users.Put(user)
.Where("attribute_not_exists(#pk)")
.WithAttribute("#pk", "pk")
.PutAsync();
Read (Get)
// Simple get
var user = await table.Users.GetAsync("user123");
// Get with composite key
var order = await table.Orders.GetAsync("customer123", "order456");
// Get with projection
var response = await table.Users.Get("user123")
.WithProjection("#name, #email")
.WithAttribute("#name", "name")
.WithAttribute("#email", "email")
.GetItemAsync();
Update
// Update specific attributes
await table.Users.Update("user123")
.Set("SET #name = :name, #email = :email")
.WithAttribute("#name", "name")
.WithAttribute("#email", "email")
.WithValue(":name", "Jane Doe")
.WithValue(":email", "jane@example.com")
.UpdateAsync();
// Conditional update
await table.Users.Update("user123")
.Where("#status = :status")
.WithAttribute("#status", "status")
.WithValue(":status", "active")
.Set("SET #name = :name")
.WithAttribute("#name", "name")
.WithValue(":name", "Jane Doe")
.UpdateAsync();
// Increment a counter
await table.Users.Update("user123")
.Set("ADD #count :inc")
.WithAttribute("#count", "login_count")
.WithValue(":inc", 1)
.UpdateAsync();
Delete
// Simple delete
await table.Users.DeleteAsync("user123");
// Conditional delete
await table.Users.Delete("user123")
.Where("#status = :status")
.WithAttribute("#status", "status")
.WithValue(":status", "inactive")
.DeleteAsync();
// Delete with composite key
await table.Orders.DeleteAsync("customer123", "order456");
Entity Definition
All examples above use this entity definition:
[DynamoDbTable("users")]
public partial class User
{
[PartitionKey]
[DynamoDbAttribute("pk")]
public string UserId { get; set; } = string.Empty;
[DynamoDbAttribute("email")]
public string Email { get; set; } = string.Empty;
[DynamoDbAttribute("name")]
public string Name { get; set; } = string.Empty;
[DynamoDbAttribute("status")]
public string Status { get; set; } = "active";
[DynamoDbAttribute("login_count")]
public int LoginCount { get; set; }
}
Learn More
- CRUD Operations Guide - Complete CRUD operations reference
- Entity Definition - How to define DynamoDB entities
- Query and Scan - Query patterns for retrieving multiple items
- Transactions - Atomic operations across multiple items