Показать значение из связанной таблицы в представлении - PullRequest
1 голос
/ 22 января 2020

Я создал модель с приложением MVC 5 Inte rnet, а затем добавил в ADO. Net Модель данных объекта> Код сначала из базы данных. Я добавил внешний ключ во вновь созданную таблицу со ссылкой на идентификатор в таблице AspNetUsers.

Я создал контроллер по умолчанию, затем View с Entity Framework, и все отображается нормально.

Имя пользователя отображалось в раскрывающемся списке с кодом ниже

@Html.DropDownList("UserID", null, htmlAttributes: new { @class = "form-control" })

Поэтому измените его на приведенное ниже, чтобы оно было доступно только для чтения

    <div class="form-group">
        @Html.LabelFor(model => model.UserID, "Username", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DisplayFor(model => model.UserID)
            @Html.HiddenFor(model => model.UserID)
        </div>
    </div>

Использовал ответ в этой теме в качестве руководства Показывать значение EditorFor () как доступное только для чтения при MVC Просмотр? Я использую VS 2013 MVC 5 плюс все обновления. Как я могу отобразить имя пользователя? Нужно ли настроить контроллер с помощью нового метода? (У меня есть UserId выше, так как я надеялся, что какое-то значение будет отображаться в исправленном коде, чтобы я мог сузить суть проблемы)

По запросу

public partial class BaseContext : DbContext
{
    public BaseContext() : base("name=BaseContext") {}

    public virtual DbSet<C__MigrationHistory> C__MigrationHistory { get; set; }
    public virtual DbSet<AspNetRole> AspNetRoles { get; set; }
    public virtual DbSet<AspNetUserClaim> AspNetUserClaims { get; set; }
    public virtual DbSet<AspNetUserLogin> AspNetUserLogins { get; set; }
    public virtual DbSet<AspNetUser> AspNetUsers { get; set; }
    public virtual DbSet<Customer> Customers { get; set; }
    public virtual DbSet<Organisation> Organisations { get; set; }
    public virtual DbSet<InternationalOffice> InternationalOffices { get; set; }
    public virtual DbSet<NewsType> NewsTypes { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<AspNetRole>()
            .HasMany(e => e.AspNetUsers)
            .WithMany(e => e.AspNetRoles)
            .Map(m => m.ToTable("AspNetUserRoles").MapLeftKey("RoleId").MapRightKey("UserId"));

        modelBuilder.Entity<AspNetUser>()
            .HasMany(e => e.AspNetUserClaims)
            .WithRequired(e => e.AspNetUser)
            .HasForeignKey(e => e.UserId);

        modelBuilder.Entity<AspNetUser>()
            .HasMany(e => e.AspNetUserLogins)
            .WithRequired(e => e.AspNetUser)
            .HasForeignKey(e => e.UserId);

        modelBuilder.Entity<AspNetUser>()
            .HasMany(e => e.Customers)
            .WithRequired(e => e.AspNetUser)
            .HasForeignKey(e => e.UserID)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<AspNetUser>()
            .HasMany(e => e.Organisations)
            .WithRequired(e => e.AspNetUser)
            .HasForeignKey(e => e.UserID)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Organisation>()
            .HasMany(e => e.Customers)
            .WithRequired(e => e.Organisation)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Organisation>()
            .HasMany(e => e.InternationalOffices)
            .WithRequired(e => e.Organisation)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<NewsType>()
            .HasMany(e => e.Customers)
            .WithRequired(e => e.NewsType)
            .WillCascadeOnDelete(false);
    }
}

1 Ответ

0 голосов
/ 23 января 2020

Поскольку ваше представление было связано с классом Organization, и у него нет свойства UserName, вам необходимо использовать свойства навигации, чтобы иметь возможность отображать его в своем представлении.

    <div class="form-group">
        @Html.LabelFor(model => model.UserID, "Username", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DisplayFor(model => model.AspNetUser.UserName)
            @Html.HiddenFor(model => model.UserID)
        </div>
    </div>

Если Organization.AspNetUser равно нулю, тогда вам нужно использовать метод .Include(), чтобы вернуть его из базы данных в вашем запросе EF.

_db.Organizations.Include(i => i.AspNetUser).FirstOrDefault(i => i.id == idVariable);

Подробнее о связанных данных в EF можно узнать на https://docs.microsoft.com/en-us/ef/ef6/querying/related-data

...