【问题标题】:How do I declare one-to-one relation in code-first ef.1如何在代码优先 ef.1 中声明一对一关系
【发布时间】:2011-10-09 13:46:28
【问题描述】:

我有两节课

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.

我该如何解决这个问题?

【问题讨论】:

    标签: ef-code-first entity-relationship


    【解决方案1】:

    实体框架不支持一对一关系,除非它是共享主键映射。因此,在您的情况下,您不能在 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();
    

    【讨论】:

    • 你几乎是对的。我可以在 User 类中有一个导航属性 Avatar,但只有这样我才在 Avatar 类中没有导航属性 User。所以有2个选项。实际上还有第三个选项——用户和头像可以存在于同一个表中,我们可以在头像类中添加一个属性 ID 并添加 HasRequired(a => a.Avatar).WithRequiredPrincipal();在 UserConfiguration 和 HasKey(a => a.Id);在 AvatarConfiguration 中。
    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多