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.
我认为有必要使用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)
这是必须关闭DatabaseGeneratedOption从Identity到None的类别之一.我已经交换了主体和依赖,因为它似乎User应该是主体.将[ForeignKey(...)]因为EF会认识到没有必要user_id在User_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)
...应该按预期工作,并将两个相关实体保存到数据库中.
| 归档时间: |
|
| 查看次数: |
12264 次 |
| 最近记录: |