首先是EF数据库的一对一关系

时间:2015-05-26 07:57:54

标签: asp.net-mvc entity-framework

我首先遇到有关实体框架数据库中一对一关系的问题。

我有两个表,一个用户表和一个用户详细信息表。

用户将包含登录信息,用户名,注册日期,userDetails将包含联系信息,网站等信息。 在我的数据库中,我的user.id引用了userdetails.userId。两者都是主键。

所以例如......

User:
Id [Primary Key (incremented)]
Password
Salt
RegisteredDate

UserDetails
UserId [Primary Key (References User.Id)]
Firstname
Contact

我的问题是我可以通过SQL Server添加记录,但EF会抛出异常。

如何在EF 6中成功创建一对一关系?

2 个答案:

答案 0 :(得分:0)

您的UserDetails应该是:

UserDetails
UserDetailId [Primary Key (incremented)]
UserId [Foreign Key (References User.Id)]
Firstname
Contact

您可以在UNIQUE INDEX

上创建foreign key
CREATE UNIQUE NONCLUSTERED INDEX [IX_UserId] ON [dbo].[UserDetails]
(
    [UserId] ASC
) ON [PRIMARY]

答案 1 :(得分:0)

尝试使用这样的模型:

public class User
{
    public int Id { get; set; }
    //...

    //navigation property
    public UserDetail UserDetail { get; set; }
}

public class UserDetail
{
    [Key,ForeignKey("User")]
    public int UserId { get; set; }
    //...

    //navigation property
    public User User { get; set; }
}

这是使用Data Annotation。如果您想使用Fluent Api,可以通过以下方式覆盖上下文中的OnModelCreating方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Configure UserId as PK for UserDetail
    modelBuilder.Entity<UserDetail>()
        .HasKey(e => e.UserId);

    // Configure StudentId as FK for StudentAddress
    modelBuilder.Entity<User>()
                .HasOptional(u => u.UserDetail) // Mark UserDetail as optional for User
                .WithRequired(ud=> ud.User); // Create inverse relationship

}

记得加密密码字段。