Quero salvar minha Edição no banco de dados e estou usando o Entity FrameWork Code-First no ASP.NET MVC 3 / C #, mas estou recebendo erros. Na minha classe Event, eu tenho tipos de dados DateTime e TimeSpan, mas no meu banco de dados, tenho Date e hora, respectivamente. Poderia ser este o motivo? Como posso transmitir para o tipo de dados apropriado no código antes de salvar as alterações no banco de dados.
public class Event
{
public int EventId { get; set; }
public int CategoryId { get; set; }
public int PlaceId { get; set; }
public string Title { get; set; }
public decimal Price { get; set; }
public DateTime EventDate { get; set; }
public TimeSpan StartTime { get; set; }
public TimeSpan EndTime { get; set; }
public string Description { get; set; }
public string EventPlaceUrl { get; set; }
public Category Category { get; set; }
public Place Place { get; set; }
}
Método no controlador >>>> Problema em storeDB.SaveChanges ();
// POST: /EventManager/Edit/386
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
var theEvent = storeDB.Events.Find(id);
if (TryUpdateModel(theEvent))
{
storeDB.SaveChanges();
return RedirectToAction("Index");
}
else
{
ViewBag.Categories = storeDB.Categories.OrderBy(g => g.Name).ToList();
ViewBag.Places = storeDB.Places.OrderBy(a => a.Name).ToList();
return View(theEvent);
}
}
com
public class EventCalendarEntities : DbContext
{
public DbSet<Event> Events { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Place> Places { get; set; }
}
Banco de Dados SQL Server 2008 R2 / T-SQL
EventDate (Datatype = date)
StartTime (Datatype = time)
EndTime (Datatype = time)
Formulário HTTP
EventDate (Datatype = DateTime) e.g. 4/8/2011 12:00:00 AM
StartTime (Datatype = Timespan/time not sure) e.g. 08:30:00
EndTime (Datatype = Timespan/time not sure) e.g. 09:00:00
Erro de Servidor na '/' Aplicação.
Falha na validação para uma ou mais entidades. Consulte a propriedade 'EntityValidationErrors' para obter mais detalhes.
Descrição: ocorreu uma exceção não tratada durante a execução da solicitação da web atual. Revise o rastreamento de pilha para obter mais informações sobre o erro e onde ele se originou no código.
Detalhes da exceção: System.Data.Entity.Validation.DbEntityValidationException: falha na validação de uma ou mais entidades. Consulte a propriedade 'EntityValidationErrors' para obter mais detalhes.
Erro de origem:
Line 75: if (TryUpdateModel(theEvent))
Line 76: {
Line 77: storeDB.SaveChanges();
Line 78: return RedirectToAction("Index");
Line 79: }
Arquivo de origem: C: \ sep \ MvcEventCalendar \ MvcEventCalendar \ Controllers \ EventManagerController.cs Linha: 77
Rastreio de pilha:
[DbEntityValidationException: falha na validação para uma ou mais entidades. Consulte a propriedade 'EntityValidationErrors' para obter mais detalhes.]
fonte
Respostas:
Você pode extrair todas as informações do
DbEntityValidationException
com o seguinte código (você precisa adicionar os espaços para nome:System.Data.Entity.Validation
eSystem.Diagnostics
suausing
lista):fonte
Required
). Adicionei uma resposta com um pouco mais de informação.Nenhuma alteração de código é necessária:
Enquanto você estiver no modo de depuração dentro do
catch {...}
bloco, abra a janela "QuickWatch" ( Ctrl+ Alt+ Q) e cole nela:ou:
Se você não estiver em uma tentativa / captura ou não tiver acesso ao objeto de exceção.
Isso permitirá que você faça drill down na
ValidationErrors
árvore. É a maneira mais fácil que eu encontrei de obter informações instantâneas sobre esses erros.fonte
No caso de você ter aulas com os mesmos nomes de propriedades, aqui está uma pequena extensão da resposta de Praveen:
fonte
Como uma melhoria para Praveen e Tony, eu uso uma substituição:
fonte
Essa implementação quebra a exceção de entidade a exceção com texto detalhado. Ele lida
DbEntityValidationException
,DbUpdateException
,datetime2
erros alcance (MS SQL), e incluem chave de entidade inválido na mensagem (útil quando savind muitas entidades em umSaveChanges
chamada).Primeiro, substitua
SaveChanges
na classe DbContext:Classe ExceptionHelper:
fonte
Esse código ajudou a encontrar meu problema quando tive um problema com meus erros de validação de entidade. Ele me disse o problema exato com minha definição de entidade. Tente seguir o código onde você precisa cobrir storeDB.SaveChanges (); na seguinte tentativa, pegue o bloco.
fonte
Eu estava recebendo esse erro hoje e não consegui resolvê-lo por um tempo, mas percebi que foi depois de adicionar alguns
RequireAttribute
s aos meus modelos e que alguns dados de sementes de desenvolvimento não estavam preenchendo todos os campos obrigatórios.Portanto, basta observar que, se você está recebendo esse erro ao atualizar o banco de dados através de algum tipo de estratégia init,
DropCreateDatabaseIfModelChanges
deve certificar-se de que seus dados iniciais cumpram e satisfaçam todos os atributos de validação de dados do modelo .Sei que isso é um pouco diferente do problema da pergunta, mas é uma pergunta popular, então pensei em acrescentar um pouco mais à resposta de outras pessoas com o mesmo problema que eu.
Espero que isso ajude os outros :)
fonte
Eu acho que adicionar try / catch para cada
SaveChanges()
operação não é uma boa prática, é melhor centralizar isso:Adicione esta classe à
DbContext
classe principal :Isso substituirá o
SaveChanges()
método do seu contexto e você obterá uma lista separada por vírgula contendo todos os erros de validação da entidade.isso também pode ser aprimorado, para registrar erros no ambiente de produção, em vez de apenas gerar um erro.
Espero que isso seja útil.
fonte
DbContext
no seu projeto.Aqui está uma extensão da extensão do Tony ... :-)
Para o Entity Framework 4.x, se você deseja obter o nome e o valor do campo-chave para saber qual instância da entidade (registro do banco de dados) tem o problema, você pode adicionar o seguinte. Isso fornece acesso aos membros da classe ObjectContext mais poderosos do seu objeto DbContext.
fonte
Não gosto de exceções, registrei o OnSaveChanges e tenho este
fonte
Este erro também ocorre quando você tenta salvar uma entidade que possui erros de validação. Uma boa maneira de fazer isso é esquecer de verificar ModelState.IsValid antes de salvar no seu banco de dados.
fonte
Certifique-se de que, se você tiver nvarchar (50) na linha do banco de dados, não tente inserir mais de 50 caracteres nela. Erro estúpido, mas levei 3 horas para descobrir.
fonte
Isso pode ser devido ao número máximo de caracteres permitido para uma coluna específica, como no sql, um campo pode ter o seguinte Tipo de Dados,
nvarchar(5)
mas o número de caracteres digitados pelo usuário é maior que o especificado, daí o erro ocorrer.fonte
Eu enfrentei o mesmo problema alguns dias atrás ao atualizar o banco de dados. No meu caso, foram adicionadas poucas novas colunas não anuláveis para manutenção que não foram fornecidas no código que está causando a exceção. Descobri esses campos e forneci valores para eles e seus resolvidos.
fonte
Thnaks por suas respostas, isso me ajuda muito. como eu codifico no Vb.Net, esse código de Bolt para o Vb.Net
fonte
pode ser causado por Propriedade que não é preenchida pelo modelo .. em vez disso, é preenchida pelo Controller .. o que pode causar esse erro. A solução é atribuir a propriedade antes de aplicar a validação do ModelState. e esta segunda suposição é. você já pode ter dados no seu banco de dados e tentar atualizá-los, mas agora buscá-los.
fonte
No meu caso, eu tenho um nome da coluna da tabela Caminho, que defini como varchar (200). Após atualizá-lo para nvarchar (max), excluí a tabela do edmx e, em seguida, adicionei novamente a tabela e ela funcionou corretamente para mim.
fonte