Tenho procurado recursos sobre como declarar relacionamentos de chave estrangeira e outras restrições usando o código EF 4.1 primeiro sem muita sorte. Basicamente, estou construindo o modelo de dados em código e usando MVC3 para consultar esse modelo. Tudo funciona via MVC, o que é ótimo (parabéns para a Microsoft!), Mas agora eu quero que NÃO funcione porque preciso ter restrições de modelo de dados.
Por exemplo, eu tenho um objeto Order que tem uma tonelada de propriedades que são objetos externos (tabelas). No momento posso criar um pedido sem problemas, mas sem ser capaz de adicionar a chave estrangeira ou objetos externos. MVC3 configura isso sem problemas.
Percebo que poderia simplesmente adicionar os objetos sozinho na classe do controlador antes de salvar, mas gostaria que a chamada para DbContext.SaveChanges () falhasse se os relacionamentos de restrição não fossem atendidos.
NOVA INFORMAÇÃO
Portanto, especificamente, gostaria que ocorresse uma exceção quando tento salvar um objeto Order sem especificar um objeto de cliente. Este não parece ser o comportamento se eu apenas compor os objetos conforme descrito na maioria da documentação do Code First EF.
Código mais recente:
public class Order
{
public int Id { get; set; }
[ForeignKey( "Parent" )]
public Patient Patient { get; set; }
[ForeignKey("CertificationPeriod")]
public CertificationPeriod CertificationPeriod { get; set; }
[ForeignKey("Agency")]
public Agency Agency { get; set; }
[ForeignKey("Diagnosis")]
public Diagnosis PrimaryDiagnosis { get; set; }
[ForeignKey("OrderApprovalStatus")]
public OrderApprovalStatus ApprovalStatus { get; set; }
[ForeignKey("User")]
public User User { get; set; }
[ForeignKey("User")]
public User Submitter { get; set; }
public DateTime ApprovalDate { get; set; }
public DateTime SubmittedDate { get; set; }
public Boolean IsDeprecated { get; set; }
}
Este é o erro que recebo agora ao acessar a visualização gerada pelo VS para o paciente:
MENSAGEM DE ERRO
O ForeignKeyAttribute na propriedade 'Paciente' no tipo 'PhysicianPortal.Models.Order' não é válido. O nome da chave estrangeira 'Parent' não foi encontrado no tipo dependente 'PhysicianPortal.Models.Order'. O valor Name deve ser uma lista separada por vírgulas de nomes de propriedades de chave estrangeira.
Saudações,
Guido
fonte
Você pode definir a chave estrangeira por:
Agora ParentId é uma propriedade de chave estrangeira e define a relação necessária entre o filho e o pai existente. Salvar a criança sem deixar os pais lançará uma exceção.
Se o nome da sua propriedade FK não consiste no nome da propriedade de navegação e nome do PK pai, você deve usar a anotação de dados ForeignKeyAttribute ou API fluente para mapear a relação
Anotação de dados:
API Fluent:
Outros tipos de restrições podem ser impostos por anotações de dados e validação de modelo .
Editar:
Você receberá uma exceção se não definir
ParentId
. É uma propriedade necessária (não anulável). Se você simplesmente não defini-lo, provavelmente tentará enviar o valor padrão para o banco de dados. O valor padrão é 0, portanto, se você não tiver um cliente com Id = 0, receberá uma exceção.fonte