1

I need help with my ASP.NET Web Api 2 project, I can make successfully send JSON data, I want to save Invites and the members who are invited.

Post Data Successfully saved on localdb

I used the scaffolding on Visual Studio 2017 and this is my first ever attempt on the .NET enviroment

{
    "InviteID": 6,
    "Subject": "sddsdsds",
    "DateTime": "54545:55",
    "Members": [
        {
            "MemberID": 8,
            "MemberName": "sdds",
            "IsAdmin": false,
            "MemberNumber": 0,
            "PhoneNumber": null,
            "InviteID": 6
        },
        {
            "MemberID": 9,
            "MemberName": "sdds",
            "IsAdmin": false,
            "MemberNumber": 0,
            "PhoneNumber": null,
            "InviteID": 6
        },
        {
            "MemberID": 10,
            "MemberName": "sdds",
            "IsAdmin": false,
            "MemberNumber": 0,
            "PhoneNumber": null,
            "InviteID": 6
        }
    ]
}

But when I try to retrieve the invites, the members array is null:

[
    {
        "InviteID": 2,
        "Subject": null,
        "DateTime": null,
        "Members": null
    },
    {
        "InviteID": 3,
        "Subject": null,
        "DateTime": null,
        "Members": null
    },
    {
        "InviteID": 4,
        "Subject": "sddsdsds",
        "DateTime": "54545:55",
        "Members": null
    },
    {
        "InviteID": 5,
        "Subject": "sddsdsds",
        "DateTime": "54545:55",
        "Members": null
    },
    {
        "InviteID": 6,
        "Subject": "sddsdsds",
        "DateTime": "54545:55",
        "Members": null
    }
]

My Invites model

public class Invite
{
    public int InviteID { get; set; }
    public string Subject { get; set; }
    public string DateTime { get; set; }
    public virtual List<Member> Members { get; set; }
}

My Member model

public class Member
{
    public int MemberID { get; set; }
    public string MemberName { get; set; }
    public bool IsAdmin { get; set; }
    public int MemberNumber { get; set; }
    public string PhoneNumber { get; set; }
    public int InviteID { get; set; }
    [JsonIgnore]
    public virtual Invite Iinvite { get; set; }
}

My controller

public class InvitesController : ApiController
{
    private InviteContext db = new InviteContext();

    public InvitesController()
    {
        db.Configuration.ProxyCreationEnabled = false;
    }

    // GET: api/Invites
    public IEnumerable<Invite> Getinvites()
    {
        return db.invites.ToList();
    }

    // GET: api/Invites/5
    [ResponseType(typeof(Invite))]
    public IHttpActionResult GetInvite(int id)
    {
        Invite invite = db.invites.Find(id);

        if (invite == null)
        {
            return NotFound();
        }

        return Ok(invite);
    }

    // PUT: api/Invites/5
    [ResponseType(typeof(void))]
    public IHttpActionResult PutInvite(int id, Invite invite)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != invite.InviteID)
        {
            return BadRequest();
        }

        db.Entry(invite).State = EntityState.Modified;

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!InviteExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return StatusCode(HttpStatusCode.NoContent);
    }

    // POST: api/Invites
    [ResponseType(typeof(Invite))]
    public IHttpActionResult PostInvite(Invite invite)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.invites.Add(invite);
        db.SaveChanges();

        return CreatedAtRoute("DefaultApi", new { id = invite.InviteID }, invite);
    }

    // DELETE: api/Invites/5
    [ResponseType(typeof(Invite))]
    public IHttpActionResult DeleteInvite(int id)
    {
        Invite invite = db.invites.Find(id);

        if (invite == null)
        {
            return NotFound();
        }

        db.invites.Remove(invite);
        db.SaveChanges();

        return Ok(invite);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }

    private bool InviteExists(int id)
    {
        return db.invites.Count(e => e.InviteID == id) > 0;
    }
}

my db context

public class InviteContext : DbContext
{
    public DbSet<Invite> invites { get; set; }
    public DbSet<Member> members { get; set; }
}

edit ** Data received when querying Member table**

[
    {
        "MemberID": 1,
        "MemberName": "sdds",
        "IsAdmin": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 2
    },
    {
        "MemberID": 2,
        "MemberName": "sdds",
        "IsAdmin": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 2
    },
    {
        "MemberID": 3,
        "MemberName": "sdds",
        "IsAdmin": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 3
    },
    {
        "MemberID": 4,
        "MemberName": "sdds",
        "IsAdmin": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 4
    },
    {
        "MemberID": 5,
        "MemberName": "sdds",
        "IsAdmin": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 5
    },
    {
        "MemberID": 6,
        "MemberName": "sdds",
        "IsAdmin": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 5
    },
    {
        "MemberID": 7,
        "MemberName": "sdds",
        "IsAdmin": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 5
    },
    {
        "MemberID": 8,
        "MemberName": "sdds",
        "IsAdmin": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 6
    },
    {
        "MemberID": 9,
        "MemberName": "sdds",
        "IsAdmin": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 6
    },
    {
        "MemberID": 10,
        "MemberName": "sdds",
        "IsAdmin": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 6
    }
]
2
  • In the DB is their a foreign key to the members table from the invites? Commented Jul 7, 2017 at 10:14
  • Yes, the Members table have InviteID foreign key and the InviteID to get inserted to the Members table, check I have showed data of members alone. Commented Jul 7, 2017 at 10:20

2 Answers 2

1

The problem may be due to lazy loading members from database. To test if that's the case the following code (do not use in production!):

// GET: api/Invites
public IEnumerable<Invite> Getinvites()
{
    var invites = db.invites.ToList()
        .ForEach(invite => invite.Members = db.members
                    .Where(m => m.InviteId == invite.InviteId)
                    .ToList())
    return invites;
}

This will force an eager load of members collection for each invite. If, after running this code, you get the expected results you'll need to configure your database context to load data eagerly.

DO NOT USE THE CODE ABOVE IN PRODUCTION!! Not only is it suboptimal but it also puts a lot of stress on database.

Sign up to request clarification or add additional context in comments.

Comments

0

You need to set ProxyCreationEnabled to true to load foreign key tables' data.

public InvitesController()
{
    db.Configuration.ProxyCreationEnabled = true;
}

If you are choosing to set ProxyCreationEnabled to false, then you need to write linq query to fetch data

public IEnumerable<Invite> Getinvites()
{
    return db.invites.Include("Members").ToList();
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.