2012-06-26 46 views
0

我使用MVC 4代碼優先使用EF 5並試圖規範化一些數據。我將與三個實體開始,給我的兩個不同的場景爲例...帶導航屬性的模型設計指導

用戶模型

public class User 
{ 
    public int UserId { get; set; } 
    public string PseudoName { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } 
    public Gender Gender { get; set; } 
    public DateTime DateOfBirth { get; set; } 

    // Other account related properties.... 

    public virtual Address Address { get; set; } 
    public virtual Profile UserProfile { get; set; } 
} 

地址型號

public class Address 
{ 
    public int UserLocationId { get; set; } 
    public int UserId { get; set; } 
    // Address properties 
} 

剖面模型

public class Profile 
{ 
    public int UserProfileId { get; set; } 
    public int UserId { get; set; } 
    // Specific details about the user... 
} 

我不太熟悉EF如何處理交易。通常我會創建一個這樣的數據庫並啓動一個事務,以確保在創建用戶時,我可以創建用戶,配置文件和地址記錄以創建用戶。用EF這樣做我必須添加用戶並保存它,然後從新生成的用戶中檢索userId,然後再調用兩個插入並將密鑰添加到地址/配置文件模型並保存。我覺得這樣做很困難,因爲如果沿途出現問題,那麼用戶文件將不會完整。現在這裏是我最初的做法,但不確定這在數據庫方面是否可以接受,但似乎目前工作正常,只需要第二個意見。

第二個場景基本上從地址和配置文件模型中刪除外鍵,我所做的是使用上下文創建我的User對象,並在User對象內創建一個新的Profile/Address屬性,只需插入並保存對象到DB。在數據庫方面會發生什麼,它會創建一個沒有任何FK的新配置文件/地址,但將用戶表中的FK添加爲Profile_ProfileId,Address_AddressId。

第二個選項比第一個更有意義嗎?

回答

0

EF足夠聰明,可以處理在單個事務中插入多個相關實體。

var user = new User { }; 
user.Profile = new Profile { }; 
user.Address = new Address { }; 
context.Users.Add(user); 
context.SaveChanges(); 

它會計算出實體的插入順序並用數據庫生成的PK值更新屬性。

+0

是的,如果我以一種特定的方式來做,就像你在那裏列出的那樣。我想出瞭如何在導航屬性表中創建FK,而不是主類的表格,所以現在這種方式很好用。 –