2016-08-31 108 views
0

如果我有一個用戶實體框架,只有一端連接

public class User : BaseEntity 
{ 
    public int Id { get; set; } 
    public AddressId {get;set;} 
    public Address Address {get; set;} 
} 

和地址類

public class Address : BaseEntity 
{ 
    public int Id { get; set; } 
} 

因此,只有這是一對一的,只有具有與該連接的用戶另一端。

我該如何使用流暢的API來設置它,也可以使我的通用SaveOrUpdate方法考慮到一次性保存圖嗎?

public static async Task<T> SaveOrUpdateAsync<T>(this GSCMContext context, T updated) where T : BaseEntity 
    { 
     if (updated == null) 
      return null; 

     if (updated.IsPersisted) 
     { 
      T existing = context.Set<T>().Find(updated.Id); 
      if (existing != null) 
      { 
       context.Entry(existing).CurrentValues.SetValues(updated); 
       await context.SaveChangesAsync(); 
      } 

      return existing; 
     } 

     context.Set<T>().Add(updated); 
     await context.SaveChangesAsync(); 
     return updated; 
    } 

回答

0

有兩種方法,我可以推薦配置一個一對一的關係:

ModelBuilder.Entity<User>().HasOptional(u => u.Address).WithOptionalPrincipal(); 

這裏的地址將擁有自己的標識列,並與FK一個user_id列到用戶。

ModelBuilder.Entity<User>().HasOptional(u => u.Address).WithOptionalDependent(); 

這裏地址將有它自己的標識列,並且用戶將有一個Address_Id列和FK到地址。

如果你想告訴EF,它應該在用戶模型填充AddressId,您必須將關係配置爲一個一對多:

ModelBuilder.Entity<User>().HasOptional(u => u.Address).WithMany().HasForeignKey(u => u.AddressId); 

這樣做,你必須實現的缺點確保不超過一個地址與每個用戶相關的邏輯。

請注意,根據需要配置一對一關係將導致EF重新使用主實體的Id作爲依賴實體,即在依賴實體的表中不會有額外的FK列。