繁体   English   中英

实体框架自引用实体

[英]Entity Framework self referencing entity

我对实体框架有疑问。

public class User : Receiver
{
    public User()
    {
        if (Groups == null)
            Groups = new List<Group>();
        if (Buddies == null)
            Buddies = new List<User>();
    }

    [Required]
    public string PhoneNumber { get; set; }
    [ForeignKey("Guid"), JsonIgnore]
    public IList<User> Buddies { get; set; }
    [ForeignKey("Guid"), JsonIgnore]
    public IList<Group> Groups { get; set; }
}

public class Receiver
{
    public Receiver()
    {
        Guid = Guid.NewGuid();
        Created = DateTime.Now;
    }

    [Key]
    public Guid Guid { get; set; }
    [Required]
    public DateTime Created { get; set; }
}

当我尝试添加用户时...

User user = new User
            {
                Guid = new Guid("8cd094c9-e4df-494e-b991-5cf5cc03d6e3"),
                PhoneNumber = "+4991276460"
            };

        cmc.Receivers.Add(user);

...它以以下错误结束。

类型“ System.Collections.Generic.List`1 [Project.Models.User]”的对象不能转换为“ Project.Models.User”。

当我注释掉以下两行时:

[ForeignKey("Guid"), JsonIgnore]
    public IList<User> Buddies { get; set; }

...程序运行正常。

我希望有人可以帮助我解决此问题。

否则,它将在此行发生错误: cmc.Receivers.Add(user);

在您的映射中...

[ForeignKey("Guid"), JsonIgnore]
public IList<User> Buddies { get; set; }

...您指定User.Buddies是一对多关系的一部分,并且User.Guid (= Receiver.Guid )是此关系中的外键。 但是User.Guid也是主键,因此它必须是唯一的。 结果, User不能有一个Buddies列表,而只能有一个参考。

映射没有意义,但是异常不是很有帮助,很难理解。 (以某种方式,EF似乎在内部认识到Buddies不能是具有该映射的列表,并且希望将该列表转换为单个引用。在我看来,它应该首先检测到该映射无效。)

为了正确的一对多映射,您需要一个与主键不同的外键。 您可以通过完全删除[ForeignKey]批注来实现...

[JsonIgnore]
public IList<User> Buddies { get; set; }

...在这种情况下,EF会在Receivers表中创建一个默认外键(它将是一个带有下划线的列,但是如果您不喜欢默认名称,则可以使用Fluent API重命名)将自己的外键属性添加到User类:

public Guid? BuddyGuid { get; set; }

[ForeignKey("BuddyGuid"), JsonIgnore]
public IList<User> Buddies { get; set; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM