Eu tenho a seguinte classe gerada pela estrutura de entidade:
public partial class ItemRequest
{
public int RequestId { get; set; }
//...
Eu gostaria de tornar este um campo obrigatório
[Required]
public int RequestId { get;set; }
No entanto, como esse código é gerado, ele será eliminado. Não consigo imaginar uma maneira de criar uma classe parcial porque a propriedade é definida pela classe parcial gerada. Como posso definir a restrição de forma segura?
c#
entity-framework
asp.net-mvc-4
P.Brian.Mackey
fonte
fonte
Respostas:
A classe gerada
ItemRequest
sempre será umapartial
classe. Isso permite que você escreva uma segunda classe parcial que é marcada com as anotações de dados necessárias. No seu caso, a classe parcialItemRequest
seria assim:fonte
Como o MUG4N respondeu, você pode usar classes parciais, mas será melhor usar interfaces . Neste caso, você terá erros de compilação se o modelo EF não corresponder ao modelo de validação. Assim, você pode modificar seus modelos de EF sem medo de que as regras de validação estejam desatualizadas.
PS Se você estiver usando um tipo de projeto que é diferente da ASP.NET MVC (quando você executa a validação manual de dados), não se esqueça de registrar seus validadores
fonte
Eu encontrei uma solução como a resposta do MUG4N , mas em vez disso, aninhei a
MetaData
classe dentro da classe de entidade, reduzindo assim o número de classes em sua lista de namespaces públicos e eliminando a necessidade de ter um nome único para cada classe de metadados.fonte
[NotMapped]
dentro da classe parcial quando preciso delas.Esta é uma espécie de extensão para a resposta @dimonser se você regenerar seu modelo de banco de dados, terá que adicionar novamente manualmente as interfaces nessas classes.
Se você tiver estômago para isso, também pode modificar seus
.tt
modelos:Aqui está um exemplo de interfaces de geração automática em algumas classes, este é um fragmento de
.tt
apenas substituir oEntityClassOpening
método no seu seguinte (e obviamentevar stringsToMatch
com seus nomes de entidade e interfaces).Nenhuma pessoa normal deveria fazer isso a si mesma, foi provado na Bíblia que alguém vai para o Inferno por causa disso.
fonte
Não tenho certeza de como fazer o que você está pedindo, mas há uma maneira de contornar isso. Validação de dados dinâmica substituindo GetValidators de seu DataAnnotationsModelValidatorProvider personalizado. Nele você pode ler as regras para validar cada campo (de um banco de dados, arquivo de configuração, etc.) e adicionar validadores conforme necessário. Tem o valor agregado de que sua validação não está mais fortemente acoplada ao modelo e pode ser alterada sem a necessidade de reiniciar o site. Claro que pode ser um exagero para o seu caso, mas foi ideal para o nosso!
fonte
Modifique o modelo T4 adicionando as anotações necessárias; este arquivo geralmente é denominado MODELNAME.tt
descubra onde o T4 está criando a classe e os métodos para saber onde colocá-los.
Você também precisará adicionar os namespaces;
Reconstrua suas classes salvando seu modelo, todos os seus métodos devem ser anotados.
fonte