C# EF代码通过DataAnnotations或fluent API进行首次自评
我有一门课:C# EF代码通过DataAnnotations或fluent API进行首次自评,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我有一门课: [Table(nameof(User), Schema = "Administration")] public class User : IBaseModel { [Key] public int UserId { get; set; } #region IBaseModel public int AddedBy { get; set; } [ForeignKey("AddedBy")] public virtual User U
[Table(nameof(User), Schema = "Administration")]
public class User : IBaseModel
{
[Key]
public int UserId { get; set; }
#region IBaseModel
public int AddedBy { get; set; }
[ForeignKey("AddedBy")]
public virtual User UserAddedBy { get; set; }
public int ModifiedBy { get; set; }
[ForeignKey("ModifiedBy")]
public virtual User UserModifiedBy { get; set; }
#endregion
}
我尝试为此表创建自关系(谁添加了项,谁修改了项)
当我的类如上所示,并且我尝试在Package Manager控制台上使用Add Migration init
时,它返回错误:
无法确定服务器之间关联的主体端
键入“abc.Administration.User”和“abc.Administration.User”。
必须显式配置此关联的主体端
使用关系API或数据注释
在出现此错误后,我尝试使用fluent API,并在ModelCreating上使用方法(在我的上下文中)编写了:
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().HasOptional(e=>e.UserAddedBy).WithMany().HasForeignKey(m=>m.AddedBy);
modelBuilder.Entity().HasOptional(e=>e.UserModifiedBy).WithMany().HasForeignKey(m=>m.ModifiedBy);
}
然后再次尝试添加迁移初始化,但我再次看到错误消息:
在模型生成过程中检测到一个或多个验证错误:
abc.User_UserAddedBy::多重性与引用冲突
关系中角色“User\u UserAddedBy\u Target”中的约束
“User_UserAddedBy”。因为所有的属性都在从属
角色不可为空,主角色的多重性必须为“1”。
abc.User\u UserModifiedBy::多重性与引用冲突
关系中角色“User\u UserModifiedBy\u Target”中的约束
“用户_UserModifiedBy”。因为依赖关系中的所有属性
角色不可为空,主角色的多重性必须为“1”
我找到了要在虚拟属性之前将必需的添加到属性的信息,但没有帮助
因为从属角色中的所有属性都不可为null,
主体角色的多重性必须为“1”
尝试使用int?
而不是int
因为从属角色中的所有属性都不可为null,
主体角色的多重性必须为“1”
尝试使用int?
而不是int
根据提供的说明,您可以执行以下操作:
禁用强制执行外键(FK)
添加一个虚拟用户,您可以使用“System”这样的名称,给它一个不可能的id,比如-1
使系统成为它自己的UserAddedBy和UserModifiedBy
启用强制FK。
现在,您可以添加系统为UserModifiedBy和UserAddedBy的用户
这样,用户中唯一“被欺骗”的将是系统,在我看来,这是一个不错的折衷办法。根据提供的说明,您可以执行以下操作:
禁用强制执行外键(FK)
添加一个虚拟用户,您可以使用“System”这样的名称,给它一个不可能的id,比如-1
使系统成为它自己的UserAddedBy和UserModifiedBy
启用强制FK。
现在,您可以添加系统为UserModifiedBy和UserAddedBy的用户
这样,用户中唯一“被欺骗”的将是系统,在我看来,这是一个不错的折衷办法。您尝试过可为空的整数吗?尝试此int?
而不是int
。DataAnnotations nullableint
它们生成指示的第一个错误,但fluent API工作正常。但是我更喜欢DataAnnotations,我想象他正在监视连接的不可为null的ForeignKey
。没有其他类,这是同一个表的两个个人关系。我注意到了,所以我删除了注释,看看我能做些什么。试试[ForeignKey(“UserAddedBy”)]public int怎么样?AddedBy{get;set;}公共虚拟用户UserAddedBy{get;set;}[ForeignKey(“UserModifiedBy”)]public int?ModifiedBy{get;set;}公共虚拟用户用户ModifiedBy{get;set;}
是否尝试了可为null的整数?尝试此int?
而不是int
。DataAnnotations nullableint
它们生成指示的第一个错误,但fluent API工作正常。但是我更喜欢DataAnnotations,我想象他正在监视连接的不可为null的ForeignKey
。没有其他类,这是同一个表的两个个人关系。我注意到了,所以我删除了注释,看看我能做些什么。试试[ForeignKey(“UserAddedBy”)]public int怎么样?AddedBy{get;set;}公共虚拟用户UserAddedBy{get;set;}[ForeignKey(“UserModifiedBy”)]public int?ModifiedBy{get;set;}公共虚拟用户用户ModifiedBy{get;set;}
我使用了您建议的解决方案,一切正常,但如果我只使用fluent API的话。我不知道为什么。我使用了你建议的解决方案,一切都正常,但如果我使用fluent API就好了。我不知道为什么。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Administration.User>().HasOptional(e => e.UserAddedBy).WithMany().HasForeignKey(m => m.AddedBy);
modelBuilder.Entity<Administration.User>().HasOptional(e => e.UserModifiedBy).WithMany().HasForeignKey(m => m.ModifiedBy);
}