具有Auto-Id的实体框架外键插入

chr*_*229 7 c# entity-framework ef-code-first entity-framework-4.1

我有2个实体User和User_Profile(一对一的关系).我将它们链接如下:

public class User
{
   [Key]   
   [ForeignKey("user_profile")]
   public int user_id {get;set;}

   public string username {get;set;}
   public string email {get;set;}

   public virtual User_Proile user_profile {get;set;}
}


public class User_Profile
{
   [Key]   
   public int user_id {get;set;}

   public string firstname {get;set;}
   public string lastname {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

user_id是SQL Server的User和User_Profile表中的PK.它还在User表中设置为Identity列.

当我尝试通过EFDBContext Add/SaveChanges插入新记录时.我收到以下错误:"User_rofile表中的user_id不能为NULL"这非常有意义,因为这是一个PK列.我希望EF能够从用户获取Identity user_id并在保存时将其插入User_Profile user_id.

这是可能的,如果是这样,我将如何实现?

更新:请注意我手动创建了数据库表和代码类,因此我无法通过.edmx文件访问StoreGeneratedPattern.

Sla*_*uma 7

我认为有必要使用Fluent API明确配置您的一对一关系:

public class MyContext : DbContext
{
    // ... your DbSets

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasRequired(u => u.user_profile)
            .WithRequiredPrincipal();
    }
}
Run Code Online (Sandbox Code Playgroud)

和实体类:

public class User
{
    [Key]   
    public int user_id {get;set;}
    public string username {get;set;}
    public string email {get;set;}
    public virtual User_Profile user_profile {get;set;}
}

public class User_Profile
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int user_id {get;set;}
    public string firstname {get;set;}
    public string lastname {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

这是必须关闭DatabaseGeneratedOptionIdentityNone的类别之一.我已经交换了主体和依赖,因为它似乎User应该是主体.将[ForeignKey(...)]因为EF会认识到没有必要user_idUser_Profile为FK属性User.

像这样的代码......

using (var context = new MyContext())
{
    var user = new User();
    var userProfile = new User_Profile();

    user.user_profile = userProfile;

    context.Users.Add(user);
    context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

...应该按预期工作,并将两个相关实体保存到数据库中.