2011-12-19 60 views
0

我有一個Member類:EF Code First 4.1:如何將Member.UserId映射到aspnet_Users.UserId?

public class Member 
{ 
    // key 
    public Guid UserId { get; set; } 

    // some other fields 
} 

另外我有一個aspnet_Users表具有UserId主柱。

我們可以:

1)。將其他屬性MembershipUser添加到Member對象,並通過調用Membership.GetUser(this.UserId)方法獲取它的值。

而且我已經添加

context.Database.ExecuteSqlCommand("ALTER TABLE [dbo].[Members] WITH CHECK ADD CONSTRAINT [FK_Members_aspnet_Users] FOREIGN KEY([UserId]) REFERENCES [dbo].[aspnet_Users] ([UserId])"); 

DataContext.Seed()方法來確保Member離不開aspnet_Users帳戶添加。 2)。在OnModelCreating中使用流暢的API。如果這是一個很好的情況下如何正確映射它們?

什麼是最佳選擇?有什麼想法嗎?

+0

小心將這樣的引用約束添加到ASP.Net Membership表中。因爲現在當您將用戶添加到您的成員表時,您必須知道您要添加的ASPNet成員。你不想從使用EF的ASPNet成員表中插入/更新/刪除。這最終可能會造成一些困難。另外,理想情況下,這將是一對一的關係。但是,你會創造一個領域的關係,我認爲這不是你的主要關鍵。 – 2011-12-19 15:30:34

+0

感謝您的提及。我認爲它應該是一對一的關係,UserId應該是關鍵。這種情況在這裏討論:http://stackoverflow.com/questions/4485350/entity-framework-1-to-1-relationship-where-one-end-is-not-a-primary-key – sashaeve 2011-12-19 15:39:59

回答

1

無論我如何避免它,我發現最好的方法是implement my own MembershipProvider並讓它使用我的模型,而不是試圖將我的模型拖入內置的成員資格提供程序。

如果您要走另一條路線,您必須將ASP.NET Membership表映射到您的域,並從ASP_User類派生您的Member類(反之亦然,如果您要確保您創建的所有用戶都是成員)。最後,我發現,雖然看起來更加努力,但實現MembershipProvider是更簡單的方法。

+0

+1 ..我完全同意。 – 2011-12-19 15:34:22

0

你不知道。不要爲aspnet_ *表添加外鍵約束。這是一個麻煩的祕訣。成員資格是插件式系統,您必須將其視爲黑盒子。

只需使用MembershipUser.ProviderUserKey查找表中的數據即可。類似這樣的:

from m in Member where UserID == (Guid)Membership.GetUser().ProviderUserKey select t; 
+0

但是,如果用戶被刪除(可能是某人的錯誤)會怎麼樣?我們如何使現有數據與新創建的(重新創建的)用戶ID同步? – Azat 2012-07-31 11:54:07

+0

@Azat - 您只需將新的ProviderUserKey設置爲用戶表中的鍵即可。 – 2012-07-31 15:40:29