2011-10-09 65 views
0

一个一对一的关系,我有两个班我如何申报代码优先ef.1

public class User 
    { 
     [Key] 
     public int Id { get; set; } 
     public Avatar Avatar { get; set; } 

    } 

public class Avatar 
    { 
     [Key] 
     public int Id { get; set; } 

     [Required] 
     public string LinkInString { get; set; } 

     [NotMapped] 
     public Uri Link 
     { 
      get { return new Uri(LinkInString); } 
      set { LinkInString = value.AbsoluteUri; } 
     } 

     public int UserId { get; set; } 
    } 

User有一个Avatar或零。

当我加2个用户

db.Users.Add(new User() { Avatar = new Avatar() { Link = new Uri("http://myUrl/%2E%2E/%2E%2A") }}); 
db.Users.Add(new User() { Avatar = new Avatar() { Link = new Uri("http://myUrl/%2E%2E/%2E%2B") }}); 
db.SaveChanges(); 

Avatar 0作为UserId,当然用户有1和2为Id.

我怎样才能解决这个问题?

回答

0

实体框架不支持一对一关系,除非它是共享主键映射。因此,在您的情况下,User类中不能有导航属性Avatar。相反,您可以在Avatar类中拥有User属性。

public class User 
{ 
     [Key] 
     public int Id { get; set; } 


} 

public class Avatar 
{ 
     [Key] 
     public int Id { get; set; } 

     [Required] 
     public string LinkInString { get; set; } 

     [NotMapped] 
     public Uri Link 
     { 
      get { return new Uri(LinkInString); } 
      set { LinkInString = value.AbsoluteUri; } 
     } 

     public int UserId { get; set; } 

     public virtual User User { get; set; } 
} 

然后你可以如下

var user = new User(); 
var avatar = = new Avatar() { User = user, Link = new Uri("http://myUrl/%2E%2E/%2E%2A") }; 
db.Users.Add(user); 
db.SaveChanges(); 
+0

你几乎正确添加实体。我可以在User类中拥有导航属性Avatar,但只有在Avatar类中没有导航属性User。所以有2个选项。实际上有第三种选择 - 用户和头像可以存在于同一个表中,我们可以在头像类中添加属性Id并添加HasRequired(a => a.Avatar).WithRequiredPrincipal();在UserConfiguration和HasKey中(a => a.Id);在AvatarConfiguration中。 – user278618