23

在EF代碼一一對應關係首先我有兩個POCO類實現零個或一個零或者用流利的API

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代碼首先通過流利的API?

+0

'公共虛擬報價報價{獲得;組; '',不是?你爲什麼不使用屬性?爲什麼你所有的領域都是私人的 –

+0

對不起,我編輯了屬性的代碼。我的課不是虛擬的。 – Masoud

+0

它不是虛擬類,它是Order類中的虛擬導航屬性。 –

回答

30

通過改變波蘇斯到:

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):

enter image description here

與特別感謝(Mr. Vahid Nasiri

+1

兩種配置都有'WithOptionalPrincipal'? – VansFannel

+0

另請參閱6.1中的此錯誤修復:https://entityframework.codeplex.com/workitem/546 – juFo

+5

注意:您必須設置兩個外鍵。如果只設置'Order.Quotation',則只在數據庫中設置'Qotations.OrderId',而不是'Order.QuotationId'。 –

4

改編自此answer,試試這個。

首先,固定你的類:

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 
} 

然後使用這樣的流利API:

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

基本上,對於1:1或[0/1]:[0/1] EF需要主鍵共享。

+0

謝謝,但通過這種映射,我們將有一個零或一對一的關係。我找到了正確的答案併發布。 – Masoud

4

http://msdn.microsoft.com/en-us/data/jj591620 EF關係

的優秀圖書 http://my.safaribooksonline.com/book/-/9781449317867

下面是從開發商後,從2010年十二月但仍相關 http://social.msdn.microsoft.com/Forums/uk/adonetefx/thread/aed3b3f5-c150-4131-a686-1bf547a68804 以上文章是一個很好的總結或這裏的可能的組合。

一個解決方案,其中依賴表具有來自主表的鍵是可能的。

如果你想在PK/FK場景中兩個都是校長的獨立密鑰,我不認爲你可以在代碼中先用Fluent API來完成。如果他們共享密鑰,那麼你沒問題。 1:1可選假定相關方使用Primary中的密鑰。

但是因爲您需要將其中一個表保存在另一個之前。您可以使用代碼檢查其中一個外鍵。或者在代碼第一次創建它之後,將第二個Foreign添加到數據庫。

你會接近。但是如果你想要外鍵的話,EF會抱怨衝突的外鍵。基本上,A取決於B取決於EF不喜歡,即使列在數據庫中可以爲空並且技術上可行。

這裏使用這個測試程序來試試它。只需評論一下Fluent API的東西來嘗試一些選擇。 我無法讓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. 
      ; 
    } 
} 
} 
+0

謝謝,你的答案幫了我,我找到了正確的答案併發布。 – Masoud

18

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")); 

它給出:

enter image description here

通過改變代碼至:

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

它提供:

enter image description here

+0

謝謝,這對我有很大幫助:) –

1
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之間的關係實體。辦公室分配只與其分配的教師相關聯,因此其主鍵也是教師實體的外鍵。但實體框架無法自動識別InstructorID作爲此實體的主鍵,因爲它的名稱不符合ID或classnameID命名約定。因此,關鍵屬性是用來識別它的關鍵是:

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-application

相關問題