[英]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.