Project Structure:
Project Depedency:
Database Table:
HeaderId NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
HeaderName VARCHAR2(100),
CreatedDate DATE DEFAULT SYSDATE
);
CREATE TABLE ItemLine (
LineId NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, -- Auto-increment
HeaderId NUMBER,
LineDescription VARCHAR2(200),
Quantity NUMBER,
FOREIGN KEY (HeaderId) REFERENCES ItemHeader(HeaderId)
);
using System.ComponentModel.
namespace itemdetails.Models
{
public class ItemHeader
{
[Key]
public int HEADERID { get; set; } // Primary Key
public string HEADERNAME { get; set; }
public DateTime CREATEDDATE { get; set; }
public ICollection<ItemLine> ItemLines { get; set; } // Navigation property
}
}
using System.ComponentModel.
using System.ComponentModel.
using System.Text.Json.
namespace itemdetails.Models
{
public class ItemLine
{
[Key]
public int LINEID { get; set; } // Primary Key
public int HEADERID { get; set; } // Foreign Key
public string LINEDESCRIPTION { get; set; }
public int QUANTITY { get; set; }
[JsonIgnore] // Ignore during JSON deserialization
public ItemHeader ItemHeader { get; set; } // Navigation property
}
}
{
public class ItemHeaderDto
{
public string HeaderName { get; set; }
public DateTime CreatedDate { get; set; }
public List<ItemLineDto> ItemLines { get; set; }
}
}
{
public class ItemLineDto
{
public string LineDescription { get; set; }
public int Quantity { get; set; }
}
}
namespace itemdetails.Service
{
public interface IItemService
{
Task<ItemHeader> CreateItemHeaderAsync(
Task<ItemLine> CreateItemLineAsync(ItemLine itemLine);
Task<ItemHeader> CreateItemHeaderWithLinesAsync (ItemHeader itemHeader);
}
}
using itemdetails.Repository;
namespace itemdetails.Service
{
public class ItemService : IItemService
{
private readonly IItemRepository _itemRepository;
public ItemService(IItemRepository itemRepository)
{
_itemRepository = itemRepository;
}
public Task<ItemHeader> CreateItemHeaderAsync(
{
throw new NotImplementedException();
}
public Task<ItemLine> CreateItemLineAsync(ItemLine itemLine)
{
throw new NotImplementedException();
}
public Task<ItemHeader> CreateItemHeaderWithLinesAsync
{
return _itemRepository.
}
}
}
namespace itemdetails.Repository
{
public interface IItemRepository
{
Task<ItemHeader> AddItemHeaderAsync(ItemHeader itemHeader);
Task<ItemLine> AddItemLineAsync(ItemLine itemLine);
Task<ItemHeader> AddItemHeaderWithLinesAsync(
}
}
using itemdetails.Models;
using Microsoft.EntityFrameworkCore;
namespace itemdetails.Repository
{
public class ItemRepository : IItemRepository
{
private readonly ApplicationDbContext _dbContext;
public ItemRepository(
_dbContext = dbContext;
}
public async Task<ItemHeader> AddItemHeaderAsync(ItemHeader itemHeader)
{
_dbContext.ItemHeaders.Add(
await _dbContext.SaveChangesAsync();
return itemHeader;
}
public async Task<ItemHeader> AddItemHeaderWithLinesAsync(
{
// Add the ItemHeader and line to the database
_dbContext.ItemHeaders.Add(
await _dbContext.SaveChangesAsync();
return itemHeader;
}
public async Task<ItemLine> AddItemLineAsync(ItemLine itemLine)
{
_dbContext.ItemLines.Add(
await _dbContext.SaveChangesAsync();
return itemLine;
}
}
}
using itemdetails.Service;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace itemdetails.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ItemController : ControllerBase
{
private readonly IItemService _itemService;
public ItemController(IItemService itemService) {
_itemService = itemService;
}
[HttpPost("Create")]
public async Task<IActionResult> CreateItemHeaderWithLines([
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
// Map DTO to domain models
var itemHeader = new ItemHeader
{
HEADERNAME = itemHeaderDto.HeaderName,
CREATEDDATE = itemHeaderDto.CreatedDate,
ItemLines = itemHeaderDto.ItemLines.
{
LINEDESCRIPTION = line.LineDescription,
QUANTITY = line.Quantity
}).ToList()
};
var createdHeader = await _itemService.
return CreatedAtAction(nameof(
}
}
}
using Microsoft.EntityFrameworkCore;
namespace itemdetails.Context
{
public class ApplicationDbContext: DbContext
{
public DbSet<ItemHeader> ItemHeaders { get; set; }
public DbSet<ItemLine> ItemLines { get; set; }
public ApplicationDbContext(
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// ItemHeader configuration
modelBuilder.Entity<
{
entity.ToTable("ITEMHEADER"); // Matches table name in database
entity.HasKey(e => e.HEADERID);
});
// ItemLine configuration
modelBuilder.Entity<ItemLine>(
{
entity.ToTable("ITEMLINE"); // Matches table name in database
entity.HasKey(e => e.LINEID);
// Foreign Key Relationship
entity.HasOne(e => e.ItemHeader)
.WithMany(h => h.ItemLines)
.HasForeignKey(e => e.HEADERID)
.OnDelete(DeleteBehavior.
});
}
}
}
using Microsoft.Extensions.Options;
using System.Configuration;
using Oracle.ManagedDataAccess.
using itemdetails.Service;
using itemdetails.Repository;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(
// Add services to the container.
builder.Services.
builder.Services.AddDbContext<
options.UseOracle(builder.
//builder.Services.
builder.Services.AddScoped<
builder.Services.AddScoped<
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/
builder.Services.
builder.Services.
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseAuthorization();
app.MapControllers();
app.Run();
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"OracleConnection": "User Id=c##ekycdev;Password=
}
}