通过Fluent API首先在EF代码中实现零或一到零或一个关系

我有两个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; } .... } 

每个订单可能由一个或零个报价单构成,而且每个报价单可能会导致一个订单,所以我有一个或一个“零”关系到“一个或零”的关系,我怎样才能在EF代码中通过stream畅的API来实现呢?

通过将pocos更改为:

 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; } } 

并使用这些映射文件:

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

我们将有这个DB(这意味着0..1-0..1):

在这里输入图像描述

特别感谢( Vahid Nasiri先生 )

Masouds程序是:

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

它给:

在这里输入图像描述

通过将代码更改为:

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

它给:

在这里输入图像描述

改编自这个答案 ,试试这个。

首先,解决你的课程:

 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 } 

然后使用这样的stream畅的API:

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

基本上,对于1:1或[0/1]:[0/1]关系,EF需要共享主键。

请参阅http://msdn.microsoft.com/en-us/data/jj591620 EF关系

一本优秀的书http://my.safaribooksonline.com/book/-/9781449317867

这是从2010年12月开发者的职位,但仍然相关http://social.msdn.microsoft.com/Forums/zh-cn/adonetefx/thread/aed3b3f5-c150-4131-a686-1bf547a68804上述文章是一个很好的总结或这里可能的组合。;

从属表具有来自主表的键的解决scheme是可能的。

如果你想在PK / FK场景中两个都是Principal的独立密钥,我不认为你可以在代码中先用Fluent API来完成。 如果他们共享一个密钥,你就可以。 1:1可选假定从属使用Primary的密钥。

但是,因为您需要将其中一个表保存在另一个表之前。 您可以使用代码检查其中一个外键。 或者在代码第一次创build它之后,再添加第二个Foreign到数据库。

你会接近。 但是如果你想要外键的话,EF会抱怨冲突的外键。 实质上,A依赖于B依赖EF不喜欢,即使列在数据库中可以是可空的和技术上可行的。

这里使用这个testing程序来尝试。 只需在stream利的API的东西评论,尝试一些select。 我无法让EF5.0与独立的PK / FK 0:1到0:1一起工作,但是当然这里有合理的妥协。

 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<DemoContext>()); } public DemoContext() : base("Name=Demo") { } public DbSet<Order> Orders { get; set; } public DbSet<Quotation> Quotations { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Order>().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<Quotation>().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. ; } } } 
 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; } } 

关键属性

教师与OfficeAssignment实体之间存在一对一或一对一的关系。 办公室分配只与其分配的教师相关,因此其主键也是教师实体的外键。 但entity framework不能自动识别InstructorID作为此实体的主键,因为它的名称不符合ID或classnameID命名约定。 因此,Key属性用于将其标识为关键字:

https://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net- MVC应用程序