Modelando um relacionamento de muitos para muitos no ASP.NET MVC usando LINQ para SQL

StackOverflow https://stackoverflow.com/questions/2145034

  •  23-09-2019
  •  | 
  •  

Pergunta

Eu tenho lido e assistindo vídeos sobre o MVC e estou começando a ficar um pouco confuso. Os tutoriais simples são simples demais e parecem envolver apenas uma única tabela de banco de dados. Whoopty Doo!

Os tutoriais avançados assumem que muito conhecimento está presente e tenho problemas para segui -los. Sem mencionar, existem 15 maneiras de modelar seu banco de dados e ninguém quer explicar por que eles fazem dessa maneira ou dessa maneira.

Então, estou procurando um tutorial simples ou explicação de qual processo você passaria para projetar um aplicativo CRUD simples que envolve um relacionamento de muitos para muitos, explicado abaixo. Talvez eu não tenha fornecido informações suficientes, portanto, sinta -se à vontade para solicitar atualizações.

Atualizações:Eu estaria interessado em ver uma solução LINQ para SQL.

Passei pelo PDF nerddinner e meu modelo deve ser um pouco diferente do dele. Eu quero um relacionamento muitos para muitos com minha refeição e meus ingredientes. Ele apenas usa um 1 a muitos com seu jantar e confirmação. Além disso, ele nunca mostra como ele anexou os RSVPs ao seu modelo de jantar. Este é essencialmente o problema que estou tendo. Por que meu modelo de refeição não contém uma lista de ingredientes? Eu tenho as chaves estrangeiras adequadas no lugar. Não tenho certeza de onde ou como eu o configuraria para poder acessar os ingredientes através do modelo de refeição, se quisesse imprimi -los na visualização de detalhes ou algo assim.

Refeições

  • Identidade
  • Título
  • Descrição

Ingredientes

  • Identidade
  • Nome

Refeições-ingredientes

  • Id_meal
  • Id_ingredent
Foi útil?

Solução

Espero que você tenha encontrado algo, mas para os outros por aí que ainda podem estar procurando, dê uma olhada nesta:

https://github.com/workshirt/wscoachmarksview

Outras dicas

Tenho muitos exemplos desse tipo de relacionamento no meu projeto atual. Estou usando o MVC 1 e o LINQ para SQL. Eu passei exatamente pela mesma frustração e depois que você está experimentando agora. O maior obstáculo é aceitar o fato de que o LINQ-para-SQL não gerencia diretamente os relacionamentos muitos para muitos, mas entender que isso não precisa para obter as informações necessárias.

Vamos começar com o R em Crud, já que é a maneira mais fácil de demonstrar o que precisa ser feito. Agora, neste momento, eu recomendaria criar um modelo de visão fortemente tipado, apenas para facilitar a tarefa de agregar seus dados de visualização e simplificar a atribuição dos dados da refeição para a exibição de detalhes:

public class MealDetailsViewModel
{
    public int Id_Meal { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }

    private List<Ingredient> _Ingredients = new List<Ingredient>();
    public List<Ingredient> Ingredients
    {
       get { return _Ingredients; }
       set { _Ingredients = value; }
    }
}

Para recuperar uma refeição e sua lista de ingredientes, aqui está o método do controlador:

public ActionResult Details (int mealID)
{
    Meal result = DataContext.Meals
        .Where(a => a.Id_Meal == mealID)
        .SingleOrDefault();

    MealDetailsViewModel viewModel = new MealDetailsViewModel
    {
        Id_Meal = result.Id,
        Title = result.Title,
        Description = result.Description,
        Ingredients = result.Meals-Ingredients
            .Where(a => a.Id_Meal == mealID)
            .Select(a => a.Ingredient)
            .ToList()
    };

    return View(viewModel);
}

Como afirmado anteriormente, o LINQ-para-SQL não suporta diretamente os relacionamentos muitos para muitos, e é por isso que você não pode ver a entidade dos ingredientes diretamente da refeição. No entanto, conforme ilustrado no método de ação do controlador, você pode acessar a entidade da associação (refeições-ingredientes) da entidade da refeição. Na entidade da associação, você pode acessar a entidade dos ingredientes para obter a lista de ingredientes. A vista seria algo assim:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="ViewPage<MealDetailsViewModel>" %>

<asp:Content ID="mainMealDetails" ContentPlaceHolderID="MainContent" runat="server">
    <h2><%= Model.Title %></h2>
    <h3><%= Model.Description %></h3>
    <br />
    <p>Ingredients:</p>
    <ul>
        <% foreach(Ingredient item in Model.Ingredients) 
           { %>
            <li><%= item.Name %></li>
        <% } %>
    </ul>
    <br />
    <%= Html.ActionLink("Update", "Edit", new { id = Model.Meal_ID }) %> |
    <%= Html.ActionLink("Add Ingredient", "IngredientCreate", new{ id = Model.Meal_ID }) %> |
    <%= Html.ActionLink("Delete", "Delete", new { id = Model.Meal_ID }) %> |
    <%= Html.ActionLink("Back to Menu List", "Index") %>
</asp.Content>

Se o seu esquema de banco de dados estiver configurado corretamente com os relacionamentos principais que você precisa, essa abordagem deve fornecer o resultado que você está procurando.

Eu recomendo o 'Pro ASP.NET MVC Framework de Steve Sanderson. É de longe o melhor guia do ASP.NET MVC que eu já vi e, na minha opinião, muito melhor do que o livro Wrox da equipe do MSOFT. Vale a pena o dinheiro, se você quiser entrar nele.

Amazon Link

Você não vai colocar tudo no prato prateado. Você terá que passar hell of wtf você mesma.

É como comigo e rubi nos trilhos - toda vez que vejo snippet de amostra ou aplicação de amostra - parece super simples e arrumado. Mas - porque eu nunca criei nada sozinho, não tenho idéias com o que começar.

Então - basta passar alguns livros e Aplicações de amostra. Então - crie algo. Esse sentimento (com o que começar, como estruturar etc.) desaparecerá em breve.

Mais tarde - não se esqueça do segundo extremo - sentindo que você sabe tudo o que precisa saber. :)


E sim - você não forneceu informações suficientes. Existem vários caminhos a seguir. Eu acredito - você não vai querer ouvir abordagens avançadas de design orientadas por domínio. Nem você quer ver o SQL ao lado da marcação HTML. Só você sabe 'o contexto'E pode decidir o que é necessário, bom e o que não é.

Você pode usar visualizações para ver os itens em uma lista ou biblioteca que são mais importantes para você ou que se encaixam em uma finalidade específica. Por exemplo, você pode criar visualizações dos arquivos em uma biblioteca que se aplicam a um departamento específico ou os itens em uma lista criada por uma pessoa específica. As visualizações estão disponíveis para a lista ou biblioteca que você os criam.

Cada lista ou biblioteca tem pelo menos uma visão. No navegador, você pode modificar essas visualizações e criar novas visualizações. Por exemplo, uma lista de tarefas inclui várias visualizações, como todas as tarefas e minhas tarefas. Você pode modificar essas visualizações alterando como os itens da lista são classificados. Ou você pode criar uma nova visão que mostra apenas que as tarefas incompletas.

Para sua exigência, você pode GTAO -> Modificar View -> em estilo -> Você pode selecionar os estilos desejados.

Dê uma olhada no link abaixo para mais detalhes sobre estilos na lista / view da biblioteca

Criar, alterar ou excluir uma visão de uma lista ou biblioteca

No link acima, role para baixo e encontre a seção denominada "Estilo" em "Configurações para visualizações" e pode ajudá-lo a fazer sua exigência.

Acho que Steven Walther tem ótimos tutoriais para o ASP.NET MVC versão 1, assumindo que você está trabalhando com a primeira versão como a versão 2 ainda não foi lançada (RC atualmente). O primeiro tutorial de trabalho começa aqui E você deve encontrar o resto a partir daí. Ele também tem muitas dicas boas se você pesquisar no blog dele nesse site.

Além disso, a maioria desses tutoriais cobre VB e C#, se isso é importante para você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top