我有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。
答案 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;}
}
有必要在其中一个课程中关闭DatabaseGeneratedOption
从Identity
到None
。我已经交换了主体和依赖,因为似乎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 属性设置为标识,以让框架知道该字段是由数据库生成的。这个链接可能有帮助...