2011-12-19 75 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