Search code examples
c#entity-framework-coreblazorasp.net-core-webapiwebapi

error when try to get values from object parameter 'object' does not contain a definition for 'employeeID'


I working on a Blazor web application server side written in C#. I have an issue that I can't get values of properties employee id and department code from object parameter to insert value on table.

I get compile-time error when try to get value for property employee ID - like this:

Error CS1061: 'object' does not contain a definition for 'employeeID' and no accessible extension method 'employeeID' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

When I check owner object after break point hit and data passed as below :

ValueKind = Object : "{"employeeID":1222,"employeeName":0,"departementCode":"211","jobCode":"1221","ownerType":null,"departementName":"ahmed"}"

[HttpPost]
public ActionResult AddOwnerFile(object owner)
{
    string ownerfileno = owner.employeeID;
    string departementCode = owner.departementCode;

    var sql = "INSERT INTO Owner (OwnerFileNo, DepartementCode) VALUES ({0}, {1})";

    var rowsAffected = _context.Database.ExecuteSqlRaw(sql, ownerfileno, departementCode);

    return Ok();
}

I expected the result would be:

ownerfileno=1222
departementCode=211

Last updated post

var employeeID = owner.GetType()
                      .GetProperties()
                      .First(o => o.Name == "employeeID")
                      .GetValue(owner, null);

I try to get the value of employeeID, but I get an error at runtime:

System.InvalidOperationException: 'Sequence contains no matching element'

How to solve this error, please?


Solution

  • Instead of using object type, create the model class for the request body.

    public class Owner
    {
        public int EmployeeID { get; set; }
        public int EmployeeName { get; set; }
        public string DepartementCode { get; set; }
        public string JobCode { get; set; }
        public int? OwnerType { get; set; }
        public string DepartementName { get; set; }
    }
    

    Amend the AddOwnerFile method to receive a parameter with the Owner type.

    While it always recommends using the parameterized query to avoid SQL injection. Reference: Passing the parameter for SQL Queries in EF Core

    [HttpPost]
    public ActionResult AddOwnerFile([FromBody]Owner owner)
    {
        var ownerfileno = new SqlParameter("@employeeID", owner.employeeID);
        var departementCode = new SqlParameter("@departementCode", owner.departementCode);
    
        var sql = "INSERT INTO Owner (OwnerFileNo, DepartementCode) VALUES (@employeeID, @departementCode)";
        var rowsAffected = _context.Database.ExecuteSqlRaw(sql, ownerfileno, departementCode);
    
               
        return Ok();
    }