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

时间:2011-10-28 19:58:26

标签: c# entity-framework entity-framework-4.1 ef-code-first

我有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;}
}

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。

2 个答案:

答案 0 :(得分:7)

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

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

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

实体类:

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;}
}

有必要在其中一个课程中关闭DatabaseGeneratedOptionIdentityNone。我已经交换了主体和依赖,因为似乎User应该是主体。 [ForeignKey(...)]不是必需的,因为EF会将user_id中的User_Profile识别为User的FK属性。

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

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

    user.user_profile = userProfile;

    context.Users.Add(user);
    context.SaveChanges();
}

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

答案 1 :(得分:0)

您必须在.edmx文件中将 StoreGeneratedPattern 属性设置为标识,以让框架知道该字段是由数据库生成的。这个链接可能有帮助...

Autonumber with Entity Framework