Implementando o relacionamento Zero Or One to Zero or One no EF Code primeiro pela Fluent API

Eu tenho duas classs POCO

public class Order { int id; string code; int? quotationId; //it is foreign key public int Id{get;set;} public string Code{get;set;} public int? QuotationId{get;set;} Quotation quotation; public virtual Quotation Quotation { get; set; } .... } public class Quotation { int Id; string Code; public int Id{get;set;} public string Code{get;set;} Order order; public virtual Order Order { get; set; } .... } 

cada Pedido pode ser feito de uma ou zero cotação, e cada cotação pode causar um pedido, então eu tenho uma relação de “um ou zero” para “um ou zero”, como posso implementar isso, no Código EF primeiro pela API fluente?

Mudando pocos para:

 public class Order { public int OrderId { get; set; } public virtual Quotation Quotation { get; set; } } public class Quotation { public int QuotationId { get; set; } public virtual Order Order { get; set; } } 

e usando esses arquivos de mapeamento:

 public class OrderMap : EntityTypeConfiguration { public OrderMap() { this.HasOptional(x => x.Quotation) .WithOptionalPrincipal() .Map(x => x.MapKey("OrderId")); } } public class QuotationMap : EntityTypeConfiguration { public QuotationMap() { this.HasOptional(x => x.Order) .WithOptionalPrincipal() .Map(x => x.MapKey("QuotationId")); } } 

nós teremos este DB (que significa 0..1-0..1):

insira a descrição da imagem aqui

com agradecimentos especiais a ( Sr. Vahid Nasiri )

O procedimento de Masouds é:

 modelBuilder.Entity() .HasOptional(o => o.Quotation) .WithOptionalPrincipal() .Map(o => o.MapKey("OrderId")); modelBuilder.Entity() .HasOptional(o => o.Order) .WithOptionalPrincipal() .Map(o => o.MapKey("QuotationId")); 

Dá:

insira a descrição da imagem aqui

Alterando o código para:

 modelBuilder.Entity() .HasOptional(o => o.Quotation) .WithOptionalPrincipal(o=> o.Order); 

Dá:

insira a descrição da imagem aqui

Consulte http://msdn.microsoft.com/pt-br/data/jj591620 Relacionamentos EF

Um excelente livro http://my.safaribooksonline.com/book/-/9781449317867

Aqui está um post do desenvolvedor de dezembro de 2010. Mas ainda relevante http://social.msdn.microsoft.com/Forums/uk/adonetefx/thread/aed3b3f5-c150-4131-a686-1bf547a68804 O artigo acima é um bom resumo ou as combinações possíveis aqui.

Uma solução em que Tabela dependente possui chave da tabela Primária é possível.

Se você quiser chaves independentes, onde ambos são principais em um cenário PK / FK, eu não acho que você pode fazê-lo em primeiro código com a API Fluent. Se eles compartilham uma chave, você está bem. 1: 1 opcional supõe que o dependente use a chave da Primária.

Mas desde que você precisa salvar uma das tabelas antes do outro. Você pode verificar uma das foreign keys com o código. OU adicione o segundo estrangeiro a database após o código primeiro criou-lo.

Você vai chegar perto. Mas a EF vai reclamar sobre foreign keys conflitantes se você quer que ambas sejam foreign keys. Essencialmente, o A depende de B depende de A EF não gosta, mesmo que as colunas sejam anuláveis ​​e tecnicamente possíveis no database.

Aqui use este programa de teste para experimentá-lo. Basta comentar em um material da API do Fluent para tentar algumas opções. Eu não consegui fazer o EF5.0 funcionar com PK / FK INDEPENDENTE 0: 1 a 0: 1 Mas é claro que existem compromissos razoáveis, conforme discutido.

 using System.Data.Entity; using System.Linq; namespace EF_DEMO { class Program { static void Main(string[] args) { var ctx = new DemoContext(); var ord = ctx.Orders.FirstOrDefault(); //. DB should be there now... } } public class Order { public int Id {get;set;} public string Code {get;set;} public int? QuotationId { get; set; } //optional since it is nullable public virtual Quotation Quotation { get; set; } //.... } public class Quotation { public int Id {get;set;} public string Code{get;set;} // public int? OrderId { get; set; } //optional since it is nullable public virtual Order Order { get; set; } //... } public class DemoContext : DbContext { static DemoContext() { Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); } public DemoContext() : base("Name=Demo") { } public DbSet Orders { get; set; } public DbSet Quotations { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().HasKey(t => t.Id) .HasOptional(t => t.Quotation) .WithOptionalPrincipal(d => d.Order) .Map(t => t.MapKey("OrderId")); // declaring here via MAP means NOT declared in POCO modelBuilder.Entity().HasKey(t => t.Id) .HasOptional(q => q.Order) // .WithOptionalPrincipal(p => p.Quotation) //as both Principals // .WithOptionalDependent(p => p.Quotation) // as the dependent // .Map(t => t.MapKey("QuotationId")); done in POCO. ; } } } 

Adaptado desta resposta , tente isto.

Primeiro, corrija suas aulas:

 public class Order { public int Id {get; set;} public virtual Quotation Quotation { get; set; } // other properties } public class Quotation { public int Id {get; set;} public virtual Order Order { get; set; } // other properties } 

Em seguida, use a API fluente assim:

 modelBuilder.Entity() .HasOptional(quote => quote.Order) .WithRequired(order=> order.Quotation); 

Basicamente, para relacionamentos 1: 1 ou [0/1]: [0/1], o EF precisa que as chaves primárias sejam compartilhadas.

 public class OfficeAssignment { [Key] [ForeignKey("Instructor")] public int InstructorID { get; set; } [StringLength(50)] [Display(Name = "Office Location")] public string Location { get; set; } public virtual Instructor Instructor { get; set; } } 

O atributo principal

Há um relacionamento de um para zero ou um entre as entidades do instrutor e do OfficeAssignment. Uma atribuição de escritório só existe em relação ao instrutor ao qual está atribuída e, portanto, sua chave primária também é sua chave estrangeira para a entidade Instrutor. Mas o Entity Framework não pode reconhecer automaticamente o InstructorID como a chave primária dessa entidade porque seu nome não segue a convenção de nomenclatura ID ou classnameID. Portanto, o atributo Key é usado para identificá-lo como a chave:

https://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net- aplicação mvc