1

我的实体框架有问题。

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);

4

1 回答 1

0

在你的映射...

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

...您指定它User.Buddies是一对多关系的一部分,并且User.Guid(= Receiver.Guid) 是此关系中的外键。但User.Guid也是主键,因此它必须是唯一的。结果 aUser不能有一个列表,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; }
于 2013-06-14T16:50:08.763 回答