6

我试图使用foreign key association方法实现EF中的一对一关联。在我的情况下,用户和团队之间存在关联,并且我需要每个人都有导航属性。 尝试保存数据时遇到了问题。实体框架将数据保存为一对一关联

这是什么型号的样子:添加像数据时

modelBuilder.Entity<User>() 
    .HasRequired(u => u.Team) 
    .WithMany() 
    .HasForeignKey(u => u.TeamID); 

modelBuilder.Entity<Team>() 
    .HasRequired(t => t.Owner) 
    .WithMany() 
    .HasForeignKey(t => t.OwnerID) 
    .WillCascadeOnDelete(false); 

现在:

public class Team 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int OwnerID { get; set; } 
    public virtual User Owner { get; set; } 
} 

public class User 
{ 
    public int ID { get; set; } 
    public string UserName { get; set; } 

    public int TeamID { get; set; } 
    public virtual Team Team { get; set; } 
} 

我说这些位到DbContextOnModelCreating(),如上面提到的博客文章指示这个:

User u = new User(); 
u.UserName = "farinha"; 
Team t = new Team("Flour Power"); 
u.Team = t; 
t.Owner = u; 
context.Users.Add(u); 
context.Teams.Add(t); 
context.SaveChanges(); 

甚至像这样:

User u = new User(); 
u.UserName = "farinha"; 
u.Team = new Team("Flour Power"); 
context.Users.Add(u); 
context.SaveChanges(); 

,我发现了以下错误:

Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.

如何解决这个任何想法?我是否以错误的方式保存数据?

在此先感谢

回答

8

你不保存数据错误的方式,但它因为你定义的双向依赖,根本无法正常工作。只有在与已保存的用户和用户相关的现有团队相关时才能保存团队。你必须做出一个关系通过(在User例如TeamId)标记外键属性为空的可选:

public class User 
{ 
    public int ID { get; set; } 
    public string UserName { get; set; } 

    public int? TeamID { get; set; } 
    public virtual Team Team { get; set; } 
} 

然后,你必须先保存User实体,然后就可以保存Team

User u = new User(); 
u.UserName = "farinha"; 
context.Users.Add(u); 
context.SaveChanges(); 

u.Team = new Team { Name = "Flour Power", OwnerID = u.ID }; 
context.SaveChanges(); 
+0

@ ladislav-mrnka这会导致错误更改为'不能将值NULL插入列'TeamID',表'DeuceHigh.dbo.User';列不允许有空值。 INSERT失败。声明已被终止。“# – Farinha 2011-05-10 23:27:45

+1

@Farinha由于您的模型已更改,您的数据库表是否已更新? – DDiVita 2011-05-11 01:13:26

+0

@Farinha:这是数据库级错误,这意味着用户表中的TeamID仍然不可空。您没有重新创建或修改数据库。 – 2011-05-11 07:04:11