I have a simple select with an option selected from the model that is loaded.
To start here is my simple model
public class invoice
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public invoice_state invoice_state { get; set; }
}
public class invoice_state
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public string alias { get; set; }
    public List<invoice> invoices { get; set; }
    [Display(Name = "title")]
    public string title { get; set; }
}
Here is what I have that works in one view.
in controller:
    public IActionResult Create()
    {
        string state = "start_finish";
        ViewBag.State = state;
        var states = _context.invoice_state.Select(c => new {
            id = c.ID,
            title = c.title
        }).ToList();
        ViewBag.States = new SelectList(states, "id", "title", _context.invoice_state.Where(e => e.alias == state).FirstOrDefault().ID);
        return View();
    }
in the view
@Html.DropDownList("invoice_state", (SelectList)ViewBag.States, "--Select One--")
That works fine, the option is selected... but on my edit view which is set up mostly the same is not working.
in controller:
    public async Task<IActionResult> Edit(int? id)
    {
        var invoice = await _context.invoice
            .Include(_item => _item.invoice_state).SingleOrDefaultAsync(m => m.ID == id);
        if (invoice == null)
        {
            return NotFound();
        }
        string state = "start_finish"; // as a default
        var states = _context.invoice_state.Select(c => new { id = c.ID, title = c.title }).ToList();
        if (null != invoice.invoice_state)
        {
            ViewBag.State = invoice.invoice_state.alias;
        }
        else
        {
            ViewBag.State = state;
        }
        ViewBag.States = new SelectList(states, "id", "title", _context.invoice_state.Where(e => e.alias == state).FirstOrDefault());
        return View(invoice);
    }
and in the edit view
  @Html.DropDownList("invoice_state", (SelectList)ViewBag.States, "--Select One--")
I have read all over the place and can't find a simple answer that isn't wire up more files, and even those haven't helped get me to the need. I have tried to force it too and it is not working, but figured it was worth placing here too.
        ViewBag.States = _context
                            .invoice_state
                            .Select(c => new SelectListItem {
                                Value = c.ID.ToString(),
                                Text = c.title
                            })
                            .Select(l => new SelectListItem {
                                Selected = (l.Value == invoice.invoice_state.ID.ToString()),
                                Text = l.Text,
                                Value = l.Value
                            });
but only get 'Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable<Microsoft.AspNetCore.Mvc.Rendering.SelectListItem>' to 'Microsoft.AspNetCore.Mvc.Rendering.SelectList' or the list version of the error if i add .ToList() on the select like before.
Some people have suggested to set the selected value, and as i read it it would be like,
if (null != invoice.invoice_state)
{
    ViewBag.invoice_stateID = invoice.invoice_state.ID;
}
else
{
    ViewBag.invoice_stateID = _context.invoice_state.Where(e => e.alias == "start_finish").FirstOrDefault().ID;
}
if i use
<select asp-for="invoice_state" asp-items="@ViewBag.States" >
    <option>Please select one</option>
</select>
It doesn't work either, see the list but nothing selected. Last note, if I select it and submit it, it does set the value in the database, just when I get back to the edit it again fails to again select anything.
Also to be clear there is the data
which came from
    <dt>
        @Html.DisplayNameFor(model => model.invoice_state)
    </dt>
    <dd>
        @Html.DisplayFor(model => model.invoice_state)
    </dd>

