Проблема с FK, равным нулю в EF - PullRequest
0 голосов
/ 04 марта 2019

У меня есть две сущности, а именно Идея и Реакция

Тема:

public class Idea
    {
        public string Id { get; set; }
        public string Description { get; set; }
        public DateTime TimePosted { get; set; }

        public ICollection<Reaction> Reactions { get; set; }
    }

Реакция:

public class Reaction
    {
        public string Id { get; set; }
        public string Text { get; set; }
        public DateTime TimePosted { get; set; }
        public Reaction Parent { get; set; }
    }

БД SQLite сгенерирована нормально, без каких-либо настроекв OnModelCreating в моем DbContext, поскольку моя реакция имела столбец для IdeaId и ParentId.Но когда я хочу добавить свою реакцию к теме, ФК, кажется, никогда не заполняется.

Вот как я пытаюсь добавить ее:

public void AddIdeaReaction(string id, string reactionText)
        {
            Idea idea = _ideaRepo.GetById(id);
            Reaction reaction = new Reaction()
            {
                Id = Guid.NewGuid().ToString(),
                TimePosted = DateTime.Now,
                Text = reactionText
            };

            _reactionRepo.Create(reaction);
            idea.Reactions.Add(reaction);
            UpdateIdea(idea);
        }

Реакция добавляется ктаблица, но FK для IdeaId остается NULL.

Что я делаю не так?

РЕДАКТИРОВАТЬ: проблема заключалась в том, что я установил для автоматического отслеживания ChangeTracker значение false.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Вам все еще нужно сообщить EF об отношениях либо через OnModelCreating, либо через конфигурацию.EF может заполнить некоторые пробелы по соглашению, но, честно говоря, я не рассчитываю на это и просто использую явные отображения, потому что тогда я уверен, что это связывает вещи так, как я ожидаю.

// ** EF6 **
public class IdeaConfiguration : EntityTypeConfiguration<Idea>
{
    public IdeaConfiguration()
    {
        ToTable("Ideas");
        HasKey(x => x.Id);

        HasMany(x => x.Reactions)
            .WithRequired()
            .Map(x => x.MapKey("IdeaId")); // This tells EF to use an IdeaId field on Reaction.
    }
}

// ** EF Core **
    public class IdeaConfiguration : IEntityTypeConfiguration<Idea>
    {
        void IEntityTypeConfiguration<Idea>.Configure(EntityTypeBuilder<Idea> builder)
        {
            builder.ToTable("Ideas");
            builder.HasKey(x => x.Id);

            builder.HasMany(x => x.Reactions)
                .WithOne()
                .HasForeignKey("IdeaId"); // Creates a shadow property for the association.
        }
    }

Это можеттакже возможно с атрибутами.Явная конфигурация IMO просто оставляет меньше загадок, чтобы тратить время.:)

0 голосов
/ 04 марта 2019

Вам необходимо добавить IdeaId в вашу Reaction таблицу

public class Reaction
{
    public string Id { get; set; }
    public string Text { get; set; }
    public DateTime TimePosted { get; set; }
    public Reaction Parent { get; set; }
    public int IdeaId { get; set; }
}

Подобно этому EF может определить, как связаны данные, когда вы создаете или обновляете объект

Извините за мой английский.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...