2013-11-15 76 views
0

識別關鍵在我的EF6代碼第一種模式,我有以下類:EF不是關係

class User : IdentityUser // so it has public string Id! 
{ 
    public virtual long ItemId { get; set; } 
    public virtual Item Item { get; set; } 
} 

class Item 
{ 
    public virtual long Id { get; set; 
    public virtual string UserId { get; set; } 
    public virtual User User { get; set; } 
} 

,並在我的情況下,我做了以下內容:

OnModelCreating(DbModelBuilder mB) 
{ 
    mB.Entity<User>().HasOptional(x => x.Item).WithOptionalPrincipal(x => x.User).WillCascadeOnDelete(false); 
} 

但是,我的遷移產生以下內容:

CreateTable(
      "dbo.Items", 
      c => new 
       { 
        Id = c.Long(nullable: false, identity: true), 
        UserId = c.String(), 
        User_Id = c.String(maxLength: 128), 
       }) 
      .PrimaryKey(t => t.Id) 
      .ForeignKey("dbo.Users", t => t.User_Id) 
      .Index(t => t.User_Id); 

我忘記了什麼?

更新:我也嘗試添加[ForeignKey("User")]Item.UserId

UPDATE2: 我發現了一個解決辦法,但它不是東西,是很...

OnModelCreating(DbModelBuilder mB) 
{ 
    mB.Entity<User>().HasOptional(x => x.Item).WithMany().HasForeignKey(x => x.ItemId); 
    mB.Entity<Item>().HasOptional(x => x.User).WithMany().HasForeignKey(x => x.UserId); 
} 
+0

爲什麼你只有虛擬財產? – jannagy02

+0

只是由類圖生成的,稍後會更改 – Nefarion

+0

您是試圖定義一對一還是一對一,還是一對一,還是實際上想要一對一-許多? http://msdn.microsoft.com/en-us/data/jj591620.aspx – Colin

回答

0

據我瞭解,實體框架通過使兩個實體共享相同的主鍵來實施一對一的關係。這意味着不需要單獨的外鍵列,因爲主鍵屬性也充當外鍵。

因此,去除多餘的外鍵,改變項目的關鍵字符串類型,以便它可以指的是用戶的ID:

class User : IdentityUser // so it has public string Id! 
{ 
    public virtual Item Item { get; set; } 
} 

class Item 
{ 
    public string Id { get; set;} 
    public virtual User User { get; set; } 
} 

現在,當需要的關係的兩端或兩者雙方是可選的實體框架不能識別依賴和委託人。依賴關係是獲取引用委託人密鑰的外鍵的依賴關係。

那麼試試這個:

modelBuilder.Entity<User>() 
      .HasOptional(f => f.Item). //Item is dependent and 
             //gets the foreign key 
      .WithOptionalPrincipal(s => s.User); 

限制性條文

我沒有嘗試過這樣或這樣做,位我不明白的是這一點。 如果兩端都是可選的,那麼Item如何才能獲得也是主鍵的User的外鍵?主鍵是必需的,但可選的外鍵不是。所以他們不可能是同一個人。

所以,如果EF現在又增加一個可選的外鍵,我將一個唯一索引添加到它,以確保它是1比1。由於它是空的,你需要使用SQL在遷移它做

Sql("CREATE INDEX ON Item(User_Id) UNIQUE WHERE User_Id IS NOT NULL")

參考文獻:

http://msdn.microsoft.com/en-us/data/jj713564

http://msdn.microsoft.com/en-us/data/jj591620.aspx

它說s表示頁上:

當關系的兩端都是可選的,使用 WithOptionalPrincipal或WithOptionalDependent的HasOptional 方法之後。

Do I define a relationship between two entities on the dependent or the principal?