C# 如何使这个基类首先与EntityFramework6.1代码一起工作

C# 如何使这个基类首先与EntityFramework6.1代码一起工作,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我有一个基类,如下所示: public abstract class BaseEntity { [Required] public DateTime Created { get; set; } public DateTime Modified { get; set; } [Required] public int CreatedByUserId { get; set; } public int ModifiedByUserId { get; se

我有一个基类,如下所示:

public abstract class BaseEntity
{
    [Required]
    public DateTime Created { get; set; }
    public DateTime Modified { get; set; }

    [Required]
    public int CreatedByUserId { get; set; }
    public int ModifiedByUserId { get; set; }

    [ForeignKey("CreatedByUserId")]
    public virtual User CreatedBy { get; set; }

    [ForeignKey("ModifiedByUserId")]
    public virtual User ModifiedBy { get; set; }
}
我想用这个类作为其他类的基础。也适用于用户类,因为用户是由其他用户创建和修改的

public class User : BaseEntity
{
    [Key]
    public int UserId { get; set; }
    ....
}
但我得到了这个错误:

必须使用关系fluent API或数据注释显式配置此关联的主体端


我研究了错误,一切都变得很清楚。EF必须被告知这些实体之间的关系,以及先保存哪个实体,然后保存哪个实体。但在所有的例子/解决方案中,我没有发现任何类似的情况。有人能帮我解决这个问题吗?我希望通过使用数据注释来修复这个问题

我不知道有什么好的数据注释解决方案,但是使用fluentapi可以非常清楚地帮助您。您应该在DbContext类中重写OnModelCreating方法

    public class MyDbContext : DbContext
    {
        DbSet<User> Users { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>()
                .HasRequired<User>(x => x.CreatedBy)
                .WithMany();

            modelBuilder.Entity<User>()
                .HasRequired<User>(x => x.ModifiedBy)
                .WithMany();
        }
    }
公共类MyDbContext:DbContext
{
DbSet用户{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(x=>x.CreatedBy)
.有许多();
modelBuilder.Entity()
.has必需(x=>x.ModifiedBy)
.有许多();
}
}

这就是你如何描述两种自我参照的一对多关系。

谢谢,这很有效。但仍对数据批注是否可以实现这一点感到好奇。@Tys,要描述与数据批注的一对多关系,您应该在“一”端创建一个集合。您可以尝试添加类似于
List EntitiesCreatedByUser
的属性
[InverseProperty(“CreatedBy”)]
将实体ModifiedByser
[InverseProperty(“ModifiedBy”)]
一起列出给用户类。但是,您需要将Id属性移动到BaseEntity以使其工作,然后强制执行EF以创建TPC方案,而不是默认的TPH。如果你愿意,我可以更新答案,但我仍然不确定它是否能正常工作。而且我认为它看起来很复杂。如果你是对的,我们最好还是这样。我将放弃我的“仅注释”要求。我不想因为这个让我的模型变得更复杂。fluentapi做得很好。