I will try to guide you from the MVC side, as this is where the problem is, I believe
In the Create() method you create the Person object and the list of Departments from the database, then both objects are passed to the View. The View takes the data from the Department list and uses it to render an HTML form - using only Id and Name.
In the next step the form is submitted to the server as a collection of value-key pairs (standard POST). The routing engine takes the requested url from the action attribute and resolves it to PersonController.Create(Person Model) action. The argument of this method is Person, so the data binder kicks in, creates the new instance of Person class and tries to match the incoming data with properties of the Person. In case of Department the incoming value is the Id of the department (because this is what you set as a value member for the DropDownList), while the property Department on the Person class is probably of Department type. This is a mismatch, so it cannot fill the property and it is left empty.
As you can see, this is not the limitation of DropDownList, the problem is that you cannot pass all Department data to the DropDownList and have it recreated during save (like with the Person), because of a nature of the POST request, and that is why the DropDownList takes only two values from each Department (value and name).
My usual solution: as normally my models are not the same classes as my business objects, I do this by having two properties on the model: get only IEnumerable property, and another DepartmentId property (get/set). Then I use it like this:
<%= Html.DropDownList("DepartmentId", Model.Departments) %>
Then in the save action, I grab the Department from the db using DepartmentId, assign it to Person and save.
In your case (models being business objects) I would probably not try to bind the Department to the Person model automatically, but just grab the Id and do it by myself.
This is just a guess (I'm not an EF specialist), but I think you may have another issue here: if the db is a field on Controller, and it is recreated at each request, this may be some unnecessary overhead. I hope it doesn't open a db connection every time, please check it.
Hope that helps