2017-05-06 76 views
0

我有2個實體,如下所示;EF代碼優先的零對一關係

public class Order 
{ 
    public int Id { get; set; } 
    public Description { get; set; } 

public virtual Purchase Purchase{ get; set;} 
} 

public class Purchase 
{ 
public int Id { get; set; } 
public Description { get; set;} 
public int? OrderId { get; set;} 

public virtual Order Order { get; set;} 
} 

這裏我先創建訂單。

  1. 根據訂單我可以創建購買。
  2. 購買可以沒有秩序也發生。所以它是可空的外鍵。
  3. 對於一個訂單,它應該只有一個購買。所以OrderId也是獨一無二的。

我怎麼能指定的Code First

+0

IIRC這將是'modelBuilder.Entity ().HasOptional(p => p.Order)' –

+0

這使得我在屬性本身指定的可選項。我需要使它獨一無二 – Akhil

回答

0

在評論你的問題這層關係,你表示:

我需要它(的OrderId)也是獨一無二的

你不能這樣做,因爲EF不支持除鍵之外的唯一列。

您可以使用一個索引,使您可以使索引唯一,但您cannot have a unique key

+0

好,所以你的意思是我指定的班級設計很好。但爲了獨特我需要手動驗證。正確? – Akhil

+0

查看其他答案。 EF確實支持唯一索引,唯一的是,它不會將它們用於驗證和關聯。 –

+0

@GertArnold OP從來沒有要求過一個唯一的索引,但是可以完成索引。 – CodingYoshi

1

可以指定一個像這樣的獨特屬性。您無法在EF6中創建唯一索引作爲外鍵的目標。

public class Order 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
    public virtual Purchase Purchase { get; set; } 
} 

public class Purchase 
{ 
    public int Id { get; set; } 
    public string Description { get; set;} 

    [Index(IsUnique = true)] 
    public int? OrderId { get; set; } 
    public virtual Order Order { get; set; } 
} 

但EF不會允許一個1-1關係到非鍵列,但像這樣具有所需要的關係模型:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Data.Entity; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApp5 
{ 
    public class Order 
    { 
     public int Id { get; set; } 
     public string Description { get; set; } 
     internal ICollection<Purchase> Purchases { get; } = new HashSet<Purchase>(); 
     public Purchase Purchase { get { return Purchases.FirstOrDefault(); } } 
    } 

    public class Purchase 
    { 
     public int Id { get; set; } 
     public string Description { get; set; } 

     [Index(IsUnique = true)] 
     public int? OrderId { get; set; } 

     [ForeignKey("OrderId")] 
     public virtual Order Order { get; set; } 
    } 

    public class Db : DbContext 
    { 
     public DbSet<Order> Orders { get; set; } 
     public DbSet<Purchase> Purchases { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<Order>().HasMany(o => o.Purchases).WithOptional(p => p.Order); 
     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Database.SetInitializer(new DropCreateDatabaseAlways<Db>()); 
      int OrderId; 
      using (var db = new Db()) 
      { 

       var o = db.Orders.Create(); 
       o.Description = "New Order"; 

       var p = db.Purchases.Create(); 
       p.Order = o; 
       p.Description = "New Purchase"; 


       db.Orders.Add(o); 
       db.Purchases.Add(p); 
       db.SaveChanges(); 
       OrderId = o.Id; 

      } 
      using (var db = new Db()) 
      { 
       var p = db.Purchases.Create(); 
       p.OrderId = OrderId; 
       p.Description = "Another Purchase"; 
       db.Purchases.Add(p); 
       db.SaveChanges(); //fails 

      } 
     } 
    } 
} 

大衛

+0

沒有。只是意味着普通的屬性可以是唯一的。在外鍵列不是關鍵字的情況下,EF不允許關係的多重性爲1-1。更新。 –