none
MVC Model com Entity Framework RRS feed

  • Pergunta

  • Olá Pessoal,

    Tenho algumas dúvidas sobre como utilizar MVC e Entity Framework.
    Eu sempre vejo os exemplos mostrando a criação do EDMX na pasta Model do projeto MVC.
    É possível utilizar o MVC com um modelo EDMX em outro projeto do tipo class library? Se sim, como fazer para o projeto MVC entender estas classes criadas pelo EDMX como objetos Model?

    Aproveitando, na versão 2 do MVC é possível fazer validação, como fazer isso utilizando mensagens do arquivo de resource para ficar com localização.

    Agradeço,
    Leonardo
    terça-feira, 9 de fevereiro de 2010 11:05

Respostas

  • Olá,

    Sim é possível separar o EDMX em outro projeto (Class Library), a sua segunda pergunta eu não entendi muito bem, mais de qualquer forma você precisa apenas referênciar a DLL no seu projeto MVC é trabalhar da mesma forma que você trabalharia se o EDMX estivesse na pasta Model.

    Sobre os resource você pode fazer assim.
    1. Adicione ADD>>ADD ASP.NET Folder>>App_LocalResources , dentro desta pasta você adiciona um MyResource.resx
    2. Dentro do MyResource altere o Access Modifier para public e adicione as suas chaves
    3. Altere o Build Action do MyResource para Embedded Resource

    E por fim nas suas validações você pode fazer assim

    public class Cliente
    {
        [Required(ErrorMessageResourceName = "ErrorNome", ErrorMessageResourceType = typeof(MvcApplication1.App_LocalResources.MyResource))]
        public string Nome { get; set; }
    
        [Required(ErrorMessageResourceName = "ErrorCPF", ErrorMessageResourceType = typeof(MvcApplication1.App_LocalResources.MyResource))]
        public string CPF { get; set; }
    
        [Required(ErrorMessageResourceName = "ErrorCNPJ", ErrorMessageResourceType = typeof(MvcApplication1.App_LocalResources.MyResource))]
        public string CNPJ { get; set; }
    }
    


    Abraços,
    Daniel Fonseca Castro
    www.danielfonsecacastro.com.br
    • Marcado como Resposta Azize quinta-feira, 18 de fevereiro de 2010 14:57
    domingo, 14 de fevereiro de 2010 10:50

Todas as Respostas

  • Olá,

    Sim é possível separar o EDMX em outro projeto (Class Library), a sua segunda pergunta eu não entendi muito bem, mais de qualquer forma você precisa apenas referênciar a DLL no seu projeto MVC é trabalhar da mesma forma que você trabalharia se o EDMX estivesse na pasta Model.

    Sobre os resource você pode fazer assim.
    1. Adicione ADD>>ADD ASP.NET Folder>>App_LocalResources , dentro desta pasta você adiciona um MyResource.resx
    2. Dentro do MyResource altere o Access Modifier para public e adicione as suas chaves
    3. Altere o Build Action do MyResource para Embedded Resource

    E por fim nas suas validações você pode fazer assim

    public class Cliente
    {
        [Required(ErrorMessageResourceName = "ErrorNome", ErrorMessageResourceType = typeof(MvcApplication1.App_LocalResources.MyResource))]
        public string Nome { get; set; }
    
        [Required(ErrorMessageResourceName = "ErrorCPF", ErrorMessageResourceType = typeof(MvcApplication1.App_LocalResources.MyResource))]
        public string CPF { get; set; }
    
        [Required(ErrorMessageResourceName = "ErrorCNPJ", ErrorMessageResourceType = typeof(MvcApplication1.App_LocalResources.MyResource))]
        public string CNPJ { get; set; }
    }
    


    Abraços,
    Daniel Fonseca Castro
    www.danielfonsecacastro.com.br
    • Marcado como Resposta Azize quinta-feira, 18 de fevereiro de 2010 14:57
    domingo, 14 de fevereiro de 2010 10:50
  • Olá Daniel,

    Obrigado pela resposta.

    Como vou colocar o attribute [Required...] se a classe é gerada pelo EDMX?

    Para isso eu deveria utilizar o attribute [MetadataType]? Se sim, eu testei isso com os attributes [DataContract] e [DataMember] e não funcionou.

    Agradeço,
    Leonardo
    quarta-feira, 17 de fevereiro de 2010 16:55
  • Você deve usar partial classes para isso. Espelhe suas entidades do EDMX com partial classes e use os decorators como indicado.
    quarta-feira, 17 de fevereiro de 2010 17:13
    Moderador
  • Olá,

    Eu entendi como deve funcionar.

    Mas por qual motivo o exemplo abaixo não funciona?

        [MetadataType(typeof(RegionMetadata))]
        public partial class Region
        {
        }

        public class RegionMetadata
        {
            [DataObjectField(true, true, false)]
            public int Id { get; set; }
        }

    Agradeço,
    Leonardo

    quarta-feira, 17 de fevereiro de 2010 17:59
  • Olá Azize,

    Para fazer as validações você pode utilizar os atributos dentro do namespace System.ComponentModel.DataAnnotations por exemplo:

    [MetadataType(typeof(RegionMetadata))]
    public partial class Region
    {
    }
    
    public class RegionMetadata
    {
        [Required(ErrorMessage = "O campo ID é obrigatório.")]
        public int Id { get; set; }
    
        [Required(ErrorMessage = "O campo Nome é obrigatório.")]
        public int Nome { get; set; }
    
        //.......
    }

    O Controller fica assim

    public class RegionController : Controller
    {
        public ActionResult Create()
        {
            return View(new Region());
        }
    
        [HttpPost]
        public ActionResult Create(Region region)
        {
            if (ModelState.IsValid)
            {
                //persiste o model
            }
    
            return View();
        }
    }

    E por fim a View

    <% using (Html.BeginForm()) {%>
    <div class="editor-field">
        <%= Html.LabelFor(model => model.Id) %>
        <%= Html.TextBoxFor(model => model.Id)%>
        <%= Html.ValidationMessageFor(model => model.Id) %>
    </div>
    <div class="editor-field">
        <%= Html.LabelFor(model => model.Nome) %>
        <%= Html.TextBoxFor(model => model.Nome) %>
        <%= Html.ValidationMessageFor(model => model.Nome) %>
    </div>
    <p>
        <input type="submit" value="Create" />
    </p>
    <% } %>







    Abraços,
    Daniel Fonseca Castro
    www.danielfonsecacastro.com.br
    quinta-feira, 18 de fevereiro de 2010 00:00