none
Validação no ADO.NET Entity Data Model RRS feed

  • Pergunta

  • Boa tarde,

    Fiz uma tabela no ADO.NET, porém na hora da validação, a validação sobre strings não é feita.

    Alguém sabe o motivo disso ? Isso é algum bug ou algo parecido ? Obrigado

    quarta-feira, 16 de janeiro de 2013 14:54

Respostas

  • Na verdade você não deveria expor essa classe na view mas sim criar uma outra classe somente para exibição dos dados..

    Mas enfm.. mas funcionar no seu caso você deve adicionar o [Required] na propriedade string:

    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    [Required(ErrorMessage = "Campo obrigatório")]
    public global::System.String outrastring


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    • Marcado como Resposta _Omnislash_ quarta-feira, 16 de janeiro de 2013 17:51
    quarta-feira, 16 de janeiro de 2013 17:03
  • Isso mesmo :)

    Sua view é diferente do seu banco, tente não misturar as coisas.

    Imagine por exemplo que você precisa fazer uma tela mostrando as informações das classes 'Tabela', 'TabelaX' e 'TabelaZ'.

    Como você faria?

    Fica dificil hehe.

    No asp.net mvc temos o conceito de ViewModel que nada mais é do que uma classe que serve unicamente para representar todos os dados da sua tela.

    Se eu fosse fazer uma para a sua tela, ela seria assim:

    public class TabelaViewModel{
         public int Modelo {get;set;}
         public int Numero{get;set;}
    
         [Required(ErrorMessage("campo obrigatório"))]
         public string OutraString {get;set;}
    }


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    • Marcado como Resposta _Omnislash_ quarta-feira, 16 de janeiro de 2013 17:51
    quarta-feira, 16 de janeiro de 2013 17:18
  • Omnislash009, a viewmodel não tem relação nenhuma com banco de dados!

    Pense na view model como sendo a representação dos dados que serão exibidos na sua view.

    Por exemplo você pode ter uma classe Pessoa com as propriedades Id, Nome, Sobrenome, Idade, RG e CPF.

    Porêm na sua view X você só precisa exibir o Id e Nome, então você cria essa viewmodel X:

    public class ViewModelX{
         public string Id{get;set;}
         public string Name{get;set;}
    }

    Já na sua view Z você precisa exibir o id, nome e todos os produtos que ele comprou, então você cria outra viewmodel:

    public class ViewModelZ{
         public string Id{get;set;}
         public string Name{get;set;}
    
         public List<ProductViewModel> Products{get;set;}
    }

    Dá uma pesquisada sobre viewmodel no google.

    Uns links legais:

    http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

    http://msdn.microsoft.com/en-us/vs2010trainingcourse_aspnetmvc3fundamentals_topic7.aspx


    http://www.linkedin.com/pub/murilo-kunze/44/191/455



    • Marcado como Resposta _Omnislash_ quarta-feira, 16 de janeiro de 2013 17:51
    • Editado Murilo Kunze quarta-feira, 16 de janeiro de 2013 17:53
    quarta-feira, 16 de janeiro de 2013 17:45

Todas as Respostas

  • Mostra o form e a view model ai.

    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    quarta-feira, 16 de janeiro de 2013 15:04
  • View:

    @model Teste.Tabela
    
    @{
        ViewBag.Title = "Create";
    }
    
    <h2>Create</h2>
    
    @using (Html.BeginForm()) {
        @Html.ValidationSummary(true)
    
        <fieldset>
            <legend>Tabela</legend>
    
            <div class="editor-label">
                @Html.LabelFor(model => model.numero)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.numero)
                @Html.ValidationMessageFor(model => model.numero)
            </div>
    
            <div class="editor-label">
                @Html.LabelFor(model => model.data)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.data)
                @Html.ValidationMessageFor(model => model.data)
            </div>
    
            <div class="editor-label">
                @Html.LabelFor(model => model.outrastring)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.outrastring)
                @Html.ValidationMessageFor(model => model.outrastring)
            </div>
    
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>
    }
    
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
    
    @section Scripts {
        @Scripts.Render("~/bundles/jqueryval")
    }

    Obrigado !
    • Editado _Omnislash_ quarta-feira, 16 de janeiro de 2013 15:26 Falta de texto
    quarta-feira, 16 de janeiro de 2013 15:25
  • Mas mostra a classe 'Tabela'.

    Nela você precisa usar o [Required].


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    quarta-feira, 16 de janeiro de 2013 15:31
  • Murilo,

    Quando eu uso o ADO.Net, eu não crio essas classes. Eu crio a tabela, crio o banco de dados e então crio os controllers e views a partir das tabelas já criadas.

    Obrigado

    quarta-feira, 16 de janeiro de 2013 16:33
  • Certo, mas você no seu sistema deve ter uma classe chamada 'Tabela', caso contrário essa tela não funcionaria pois você definiu essa classe como sendo o model para a tela.

    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    quarta-feira, 16 de janeiro de 2013 16:37
  • Essa classe seria o Arquivo.Designer.cs ? 

    Desculpe a burrice rsrsrs

    quarta-feira, 16 de janeiro de 2013 16:42
  • Isso não sei hehe.

    Dá uma pesquisada ai nos arquivos e procura a classe Tabela.

    Você pode dar um ctrl + f e procurar no projeto inteiro.


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    quarta-feira, 16 de janeiro de 2013 16:45
  • O que eu achei foram as linhas de código no Designer.cs

    using System;
    using System.ComponentModel;
    using System.Data.EntityClient;
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.Xml.Serialization;
    
    [assembly: EdmSchemaAttribute()]
    namespace Teste
    {
        #region Contexts
        
        /// <summary>
        /// No Metadata Documentation available.
        /// </summary>
        public partial class ModeloContainer : ObjectContext
        {
            #region Constructors
        
            /// <summary>
            /// Initializes a new ModeloContainer object using the connection string found in the 'ModeloContainer' section of the application configuration file.
            /// </summary>
            public ModeloContainer() : base("name=ModeloContainer", "ModeloContainer")
            {
                this.ContextOptions.LazyLoadingEnabled = true;
                OnContextCreated();
            }
        
            /// <summary>
            /// Initialize a new ModeloContainer object.
            /// </summary>
            public ModeloContainer(string connectionString) : base(connectionString, "ModeloContainer")
            {
                this.ContextOptions.LazyLoadingEnabled = true;
                OnContextCreated();
            }
        
            /// <summary>
            /// Initialize a new ModeloContainer object.
            /// </summary>
            public ModeloContainer(EntityConnection connection) : base(connection, "ModeloContainer")
            {
                this.ContextOptions.LazyLoadingEnabled = true;
                OnContextCreated();
            }
        
            #endregion
        
            #region Partial Methods
        
            partial void OnContextCreated();
        
            #endregion
        
            #region ObjectSet Properties
        
            /// <summary>
            /// No Metadata Documentation available.
            /// </summary>
            public ObjectSet<Tabela> TabelaSet
            {
                get
                {
                    if ((_TabelaSet == null))
                    {
                        _TabelaSet = base.CreateObjectSet<Tabela>("TabelaSet");
                    }
                    return _TabelaSet;
                }
            }
            private ObjectSet<Tabela> _TabelaSet;
    
            #endregion
    
            #region AddTo Methods
        
            /// <summary>
            /// Deprecated Method for adding a new object to the TabelaSet EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
            /// </summary>
            public void AddToTabelaSet(Tabela tabela)
            {
                base.AddObject("TabelaSet", tabela);
            }
    
            #endregion
    
        }
    
        #endregion
    
        #region Entities
        
        /// <summary>
        /// No Metadata Documentation available.
        /// </summary>
        [EdmEntityTypeAttribute(NamespaceName="Modelo", Name="Tabela")]
        [Serializable()]
        [DataContractAttribute(IsReference=true)]
        public partial class Tabela : EntityObject
        {
            #region Factory Method
        
            /// <summary>
            /// Create a new Tabela object.
            /// </summary>
            /// <param name="iD_Tabela">Initial value of the ID_Tabela property.</param>
            /// <param name="numero">Initial value of the numero property.</param>
            /// <param name="data">Initial value of the data property.</param>
            /// <param name="outrastring">Initial value of the outrastring property.</param>
            public static Tabela CreateTabela(global::System.Int32 iD_Tabela, global::System.Int32 numero, global::System.DateTime data, global::System.String outrastring)
            {
                Tabela tabela = new Tabela();
                tabela.ID_Tabela = iD_Tabela;
                tabela.numero = numero;
                tabela.data = data;
                tabela.outrastring = outrastring;
                return tabela;
            }
    
            #endregion
    
            #region Primitive Properties
        
            /// <summary>
            /// No Metadata Documentation available.
            /// </summary>
            [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
            [DataMemberAttribute()]
            public global::System.Int32 ID_Tabela
            {
                get
                {
                    return _ID_Tabela;
                }
                set
                {
                    if (_ID_Tabela != value)
                    {
                        OnID_TabelaChanging(value);
                        ReportPropertyChanging("ID_Tabela");
                        _ID_Tabela = StructuralObject.SetValidValue(value);
                        ReportPropertyChanged("ID_Tabela");
                        OnID_TabelaChanged();
                    }
                }
            }
            private global::System.Int32 _ID_Tabela;
            partial void OnID_TabelaChanging(global::System.Int32 value);
            partial void OnID_TabelaChanged();
        
            /// <summary>
            /// No Metadata Documentation available.
            /// </summary>
            [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
            [DataMemberAttribute()]
            public global::System.Int32 numero
            {
                get
                {
                    return _numero;
                }
                set
                {
                    OnnumeroChanging(value);
                    ReportPropertyChanging("numero");
                    _numero = StructuralObject.SetValidValue(value);
                    ReportPropertyChanged("numero");
                    OnnumeroChanged();
                }
            }
            private global::System.Int32 _numero;
            partial void OnnumeroChanging(global::System.Int32 value);
            partial void OnnumeroChanged();
        
            /// <summary>
            /// No Metadata Documentation available.
            /// </summary>
            [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
            [DataMemberAttribute()]
            public global::System.DateTime data
            {
                get
                {
                    return _data;
                }
                set
                {
                    OndataChanging(value);
                    ReportPropertyChanging("data");
                    _data = StructuralObject.SetValidValue(value);
                    ReportPropertyChanged("data");
                    OndataChanged();
                }
            }
            private global::System.DateTime _data;
            partial void OndataChanging(global::System.DateTime value);
            partial void OndataChanged();
        
            /// <summary>
            /// No Metadata Documentation available.
            /// </summary>
            [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
            [DataMemberAttribute()]
            public global::System.String outrastring
            {
                get
                {
                    return _outrastring;
                }
                set
                {
                    OnoutrastringChanging(value);
                    ReportPropertyChanging("outrastring");
                    _outrastring = StructuralObject.SetValidValue(value, false);
                    ReportPropertyChanged("outrastring");
                    OnoutrastringChanged();
                }
            }
            private global::System.String _outrastring;
            partial void OnoutrastringChanging(global::System.String value);
            partial void OnoutrastringChanged();
    
            #endregion
    
        
        }
    
        #endregion
    
        
    }
    

    Uma coisa que eu notei de diferente, foi as linhas que tem o SetValidValue.

     _outrastring = StructuralObject.SetValidValue(value, false);
    
    
    _data = StructuralObject.SetValidValue(value);
    
    
    _numero = StructuralObject.SetValidValue(value);

    Se eu tento mudar o SetValidValue do _outrastring e deixa-la igual ao SetValideValue de _data ou _numero dá erro =/

    Obrigado

    quarta-feira, 16 de janeiro de 2013 16:59
  • Na verdade você não deveria expor essa classe na view mas sim criar uma outra classe somente para exibição dos dados..

    Mas enfm.. mas funcionar no seu caso você deve adicionar o [Required] na propriedade string:

    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    [Required(ErrorMessage = "Campo obrigatório")]
    public global::System.String outrastring


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    • Marcado como Resposta _Omnislash_ quarta-feira, 16 de janeiro de 2013 17:51
    quarta-feira, 16 de janeiro de 2013 17:03
  • Deu certinho, obrigado.

    Mas não entendi sua explicação. Eu deveria criar a tabela la no ADO e em seguida criar uma classe na mão equivalente a essa tabela ? Poderia me dar um exemplo por favor ?

    quarta-feira, 16 de janeiro de 2013 17:13
  • Isso mesmo :)

    Sua view é diferente do seu banco, tente não misturar as coisas.

    Imagine por exemplo que você precisa fazer uma tela mostrando as informações das classes 'Tabela', 'TabelaX' e 'TabelaZ'.

    Como você faria?

    Fica dificil hehe.

    No asp.net mvc temos o conceito de ViewModel que nada mais é do que uma classe que serve unicamente para representar todos os dados da sua tela.

    Se eu fosse fazer uma para a sua tela, ela seria assim:

    public class TabelaViewModel{
         public int Modelo {get;set;}
         public int Numero{get;set;}
    
         [Required(ErrorMessage("campo obrigatório"))]
         public string OutraString {get;set;}
    }


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    • Marcado como Resposta _Omnislash_ quarta-feira, 16 de janeiro de 2013 17:51
    quarta-feira, 16 de janeiro de 2013 17:18
  • Ok, mas fui la no ADO, criei as tabelas necessárias, cliquei com o botão direito, selecionei "Generate Database from Model" e criei o banco de dados com o nome BD_Tabelas, por exemplo.

    Nas ViewModels, fui la, declarei cada atributo necessário e em seguida criei a classe responsável pela criação do banco de dados

    public class NomeQualquer : DbContext
        {
    
            public DbSet<DBSet1> DBSet1 { get; set; }
            public DbSet<DBSet2> DBSet2 { get; set; }
            public DbSet<DBSet3> DBSet3 { get; set; }
                            
    
                     ..........
    
    
    }

    Se eu crio essa classe com o mesmo do banco de dados (BD_Tabelas), O Visual Studio ou MVC conseguem assimilar que é o mesmo banco de dados ?

    quarta-feira, 16 de janeiro de 2013 17:37
  • Omnislash009, a viewmodel não tem relação nenhuma com banco de dados!

    Pense na view model como sendo a representação dos dados que serão exibidos na sua view.

    Por exemplo você pode ter uma classe Pessoa com as propriedades Id, Nome, Sobrenome, Idade, RG e CPF.

    Porêm na sua view X você só precisa exibir o Id e Nome, então você cria essa viewmodel X:

    public class ViewModelX{
         public string Id{get;set;}
         public string Name{get;set;}
    }

    Já na sua view Z você precisa exibir o id, nome e todos os produtos que ele comprou, então você cria outra viewmodel:

    public class ViewModelZ{
         public string Id{get;set;}
         public string Name{get;set;}
    
         public List<ProductViewModel> Products{get;set;}
    }

    Dá uma pesquisada sobre viewmodel no google.

    Uns links legais:

    http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

    http://msdn.microsoft.com/en-us/vs2010trainingcourse_aspnetmvc3fundamentals_topic7.aspx


    http://www.linkedin.com/pub/murilo-kunze/44/191/455



    • Marcado como Resposta _Omnislash_ quarta-feira, 16 de janeiro de 2013 17:51
    • Editado Murilo Kunze quarta-feira, 16 de janeiro de 2013 17:53
    quarta-feira, 16 de janeiro de 2013 17:45
  • Ahhhh, dessa vez eu entendi rsrsrs.

    O que mais me impressiona é que vc não deixa passar uma rs.

    Muito obrigado ! =)

    quarta-feira, 16 de janeiro de 2013 17:51
  • ahuahuahuaua

    Várias vezes eu deixo :)


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    quarta-feira, 16 de janeiro de 2013 17:52