застрял с asp.net mvc 3.0 Леса в случае многих ко многим отношениям - PullRequest
2 голосов
/ 25 июля 2011

Я работаю над приложением mvc3.0, используя сначала код EF и леса mvc.В настоящее время я застрял во многих отношениях между сущностями.У меня есть следующая модель.

namespace BigApp.Models {

#region POCO Objects
public class Group
{
    public int Id { get; set; }
    public string Name { get; set; }        
    public DateTime CreatedOn { get; set; }
    public DateTime UpdatedOn { get; set; }

    public virtual ICollection<Project> Projects { get; set; }
}
public class Project
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Url { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime UpdatedOn { get; set; }
    public bool isFeatured { get; set; }
    public bool isDisabled { get; set; }
    public int GroupId { get; set; }
    public virtual Group Group { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }

}
public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime UpdatedOn { get; set; }
    public virtual ICollection<Project> Projects { get; set; }
}
public class Attachment
{
    public int Id { get; set; }

    public DateTime CreatedOn { get; set; }
    public DateTime UpdatedOn { get; set; }

    public int ProjectId { get; set; }
    public virtual Project Project { get; set; }
}

public class BigAppContext : DbContext
{
    // You can add custom code to this file. Changes will not be overwritten.
    // 
    // If you want Entity Framework to drop and regenerate your database
    // automatically whenever you change your model schema, add the following
    // code to the Application_Start method in your Global.asax file.
    // Note: this will destroy and re-create your database with every model change.
    // 
    // System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<BigApp.Models.BigAppContext>());

    public DbSet<BigApp.Models.Group> Groups { get; set; }

    public DbSet<BigApp.Models.Project> Projects { get; set; }

    public DbSet<BigApp.Models.Tag> Tags { get; set; }

    public DbSet<BigApp.Models.Attachment> Attachments { get; set; }
}

#endregion

}

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

http://i.stack.imgur.com/v10oO.jpg

Все операции crud работают нормально, за исключением связи между многими и многими проектами и тегами.Проверьте интерфейс создания проекта, указанный ниже.

http://i.stack.imgur.com/Lzp3j.jpg

Все, что я хочу, - это список, в котором отображаются все мои теги.Какие изменения я должен сделать.Нужно ли обновлять мою модель проекта?или ввести ProjectViewModel, который содержит все теги, а затем передал его на мой взгляд?

Исходный код можно найти по адресу github.com/najamsk/BigApp

Спасибо.Жду ответов.

Ответы [ 3 ]

8 голосов
/ 05 августа 2011

Ответ Скотта Хансельмана верен - отношения многие ко многим выходят за рамки того, что леса будут обрабатывать изначально (причина этого отчасти в том, что существует слишком много различных общих типов пользовательских интерфейсов редактирования "многие ко многим") крайне маловероятно, что мы сможем адекватно угадать, какой интерфейс вы хотите).

Два варианта:

  1. Используйте строительные леса в качестве отправной точки и, исходя из того, что у вас уже есть, добавьте список множественного выбора на экран «Редактировать проект», чтобы пользователи могли добавлять / удалять теги. Это этап разработки вручную, который потребует большего знакомства с разработкой ASP.NET MVC.
  2. В качестве альтернативы, вы можете создать явную «сущность ссылки», например, называется TagAssignment, который имеет отношение один-ко-многим как с Project, так и с Tag (таким образом, у Project есть много TagAssignments, а у Tag есть много TagAssignments). Тогда scaffolding сможет сгенерировать для вас пользовательский интерфейс для создания произвольного числа TagAssignments между проектами и тегами.
4 голосов
/ 25 июля 2011

Возможно, вы достигли пределов «быстрого старта», который предоставляет Scaffolding, и вам, возможно, придется написать свои взгляды самостоятельно.Я спрошу Стива Сандерсона.

0 голосов
/ 25 июля 2011

почему вы не создаете представление, которое делает это, или вы можете создать хранимую процедуру в своей базе данных, которая реализует это, тогда вы можете использовать ее в своем коде простым способом, потому что у ef есть проблема отношения многих ко многимиз коробки я уверен, что вы получите ответ :) пометьте как ответ, если это поможет

обратите внимание: для меня я использую пользовательский слой доступа к данным, а не модель mvc, потому что у меня много пользовательских требованийдля моих проектов

...