public class Order
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string UserId { get; set; } = null!;
public DkUser User { get; set; } = null!;
public int ShippingStatusId { get; set; }
public ShippingStatus ShippingStatus { get; set; } = null!;
public DateTime CreatedDate { get; set; }
public DateTime UpdatedDate { get; set; }
public string? CreatedBy { get; set; }
public string? UpdatedBy { get; set; }
public ICollection Products { get; set; } = new List();
public ICollection OrderDetails {get; set;} = [];
}
public class Product
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Brand { get; set; } = string.Empty;
public string Model { get; set; } = string.Empty;
public float Price { get; set; }
public int View { get; set; }
public int CategoryId { get; set; }
public Category? Category { get; set; }
public int DiscountId { get; set; }
public Discount Discount { get; set; } = null!;
public DateTime CreatedDate { get; set; }
public DateTime UpdatedDate { get; set; }
public string? CreatedBy { get; set; }
public string? UpdatedBy { get; set; }
public ICollection Orders { get; set; } = new List();
public ICollection OrderDetails { get; set; } = [];
public ICollection ProductPictures { get; set; } = new List();
}
public class OrderDetail
{
public int ProductId { get; set; }
public Product Product { get; set; } = new();
public int OrderId { get; set; }
public Order Order { get; set; } = new();
public int Amount { get; set; }
}
class DkdbContext(DbContextOptions options) : IdentityDbContext(options)
{
public DbSet Computers { get; set; }
public DbSet Products { get; set; }
public DbSet Categories { get; set; }
public DbSet Orders { get; set; }
public DbSet Discounts { get; set; }
public DbSet ShippingStatuses { get; set; }
public DbSet ProductPictures { get; set; }
public DbSet DkUsers { get; set; }
public DbSet OrderDetails { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity()
.HasKey(c => c.Id);
builder.Entity()
.Property(c => c.Id)
.HasColumnType("uuid");
builder.Entity()
.HasMany(e => e.Products)
.WithOne(e => e.Category)
.HasForeignKey(e => e.CategoryId)
.IsRequired();
builder.Entity()
.HasOne(e => e.Discount)
.WithMany(e => e.Products)
.HasForeignKey(e => e.DiscountId)
.IsRequired();
builder.Entity()
.Property(e => e.CreatedDate)
.HasDefaultValueSql("current_timestamp");
builder.Entity()
.Property(e => e.UpdatedDate)
.HasDefaultValueSql("current_timestamp");
builder.Entity()
.Property(e => e.View)
.HasDefaultValue(1);
builder.Entity()
.Property(e => e.CreatedDate)
.HasDefaultValueSql("current_timestamp");
builder.Entity()
.Property(e => e.UpdatedDate)
.HasDefaultValueSql("current_timestamp");
builder.Entity()
.Property(e => e.ShippingStatusId)
.HasDefaultValue(1);
builder.Entity()
.HasOne(e => e.Product)
.WithMany(e => e.ProductPictures)
.HasForeignKey(e => e.ProductId)
.IsRequired();
// order detail config
builder.Entity()
.HasMany(e => e.Orders)
.WithMany(e => e.Products)
.UsingEntity();
builder.Entity()
.Property(e => e.Amount)
.HasDefaultValue(1);
// end order detail config
builder.Entity()
.HasMany(e => e.Orders)
.WithOne(e => e.ShippingStatus)
.HasForeignKey(e => e.ShippingStatusId);
builder.Entity()
.HasMany(e => e.Orders)
.WithOne(e => e.User)
.HasForeignKey(e => e.UserId);
}
}
i want to create a new order with 2 products and corresponding amount specified. here is how i implement it:
public class OrderEnpoint
{
public static void Map(WebApplication app)
{
app.MapPost("/order", async (DkdbContext db, OrderDto orderRequest, UserManager userManager) =>
{
if (orderRequest == null || string.IsNullOrEmpty(orderRequest.UserId))
return Results.BadRequest();
var user = await userManager.FindByIdAsync(orderRequest.UserId);
var newOrder = new Order
{
UserId = orderRequest.UserId,
CreatedBy = user?.UserName,
UpdatedBy = user?.UserName,
};
await db.Orders.AddAsync(newOrder);
await db.SaveChangesAsync();
var _OrderDetails = orderRequest.ProductOrderList
.Select(e => new OrderDetail
{
OrderId = newOrder.Id,
ProductId = e.ProductId,
Amount = e.Amount,
}).ToList();
await db.OrderDetails.AddRangeAsync(_OrderDetails);
await db.SaveChangesAsync();
return Results.Created();
});
}
}
here is my data transfer object class:
public class OrderDto
{
public string UserId { get; set; } = string.Empty;
public List ProductOrderList { get; set; } = [];
}
public class OrderRequest
{
[Required]
public int ProductId { get; set; }
[Required]
public int Amount { get; set; }
}
When i debug this code, I am able to see order record created in Orders table, but not in OrderDetails. am using postgres as database. here is what the error look like:
---> Npgsql.PostgresException (0x80004005): 23502: null value in column "UserId" of relation "Orders" violates not-null constraint
DETAIL: Failing row contains (15, null, 1, 2024-01-01 14:07:25.091254+00, 2024-01-01 14:07:25.091254+00, null, null).
Exception data:
Severity: ERROR
SqlState: 23502
MessageText: null value in column "UserId" of relation "Orders" violates not-null constraint
Detail: Failing row contains (15, null, 1, 2024-01-01 14:07:25.091254+00, 2024-01-01 14:07:25.091254+00, null, null).
SchemaName: public
TableName: Orders
ColumnName: UserId
File: execMain.c
Line: 2003
Routine: ExecConstraints
i expect to be able to create a new Order with associated OrderDetail with amount respectively. I am looking for solutions, am glad if someone can help. thank you.
0 comments:
Post a Comment
Thanks