首页 > 解决方案 > 使用 Entity Framework Core 3.1 在 OnModelCreating 中定义一对多关系

问题描述

我是 Entity Framework Core 3.1 的新手,并试图定义两个表之间的一对多关系。我目前正在努力并遇到编译错误。有人可以告诉我可能是什么问题。

错误是:

PersonNote 不包含 PersonNote 的定义

我目前正在排队

entity.HasOne(d => d.PersonNote)

我还能如何定义一对多关系?

这两个表是PersonPersonNote。一个Person可以有很多PersonNotes。我已经为他们定义了模型

public class Person
{
        public int Id { get; set; }
        public int? TitleId { get; set; }
        public string FirstName { get; set; }
        public string FirstNamePref { get; set; }
        public string MiddleName { get; set; }
        public string LastName { get; set; }
        public DateTime? DateOfBirth { get; set; }
        public string Gender { get; set; }
        public int AddressId { get; set; }
        public string TelephoneNumber { get; set; }
        public string MobileNumber { get; set; }
        public string Email { get; set; }
        public int? PartnerId { get; set; }
        public bool Enabled { get; set; }
        public string CreatedBy { get; set; }
        public DateTime Created { get; set; }
        public string ModifiedBy { get; set; }
        public DateTime Modified { get; set; }
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime RecordStartDateTime { get; set; }
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime RecordEndDateTime { get; set; }
        public Address Address { get; set; }
        public Title Title { get; set; }
        public Client Client { get; set; }

        internal static IEnumerable<object> Include(Func<object, object> p)
        {
            throw new NotImplementedException();
        }

        public PersonNote PersonNote { get; set; }
}

public class PersonNote
{
        public int Id { get; set; }
        public int PersonId { get; set; }
        public string Note { get; set; }
        public int AuthorId { get; set; }
        public string CreatedBy { get; set; }
        public DateTime Created { get; set; }
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime RecordStartDateTime { get; set; }
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime RecordEndDateTime { get; set; }
}



public IEnumerable<PersonNote> GetPersonNotes(int personId)
        {
             var PersonNotes = PersonNote
               .Include(x => x.)
                  .Where(x => x.Id == personId)
               .ToList();

            return PersonNotes;
        }

我尝试了以下方法OnModelCreating

modelBuilder.Entity<PersonNote>(entity =>
            {
                entity.ToTable("PersonNote", "common");
                entity.HasOne(d => d.PersonNote)
                    .WithMany(p => p.Person)
                    .HasForeignKey(d => d.PersonId)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("FK_commonPersonNote_commonPerson");
            });

标签: entity-frameworkentity-framework-core

解决方案


你应该有这样的东西(省略其他属性):

class Person
{
    [Key]
    public int Id { get; set; }
    public List<PersonNote> PersonNotes { get; set; }
}

class PersonNote
{
    [Key]
    public int Id { get; set; }
    public int PersonId { get; set; }
}

class StackOverflow : DbContext
{
    public DbSet<Person> Persons { get; set; }
    public DbSet<PersonNote> PersonNotes  { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
            .HasMany(p => p.PersonNotes)
            .WithOne()
            .HasForeignKey(p => p.PersonId);
    }
}

推荐阅读