Проблема удаления отношения «один ко многим» с использованием CodeFirst CTP5 - PullRequest
1 голос
/ 10 марта 2011

Я работаю с CodeFirst CTP5.

Как вы можете видеть в моем коде, у меня есть пользователь со многими вопросами. Я хочу иметь возможность удалить пользователя, но оставив вопрос. Кроме того, я также хочу сохранить свойство UserId в вопросе

public class User
{
    public User()
    {
        Questions = new List<Question>();
    }

    public virtual string UserId { get; set; }

    public virtual ICollection<Question> Questions { get; set; }
}

public class Question
{
    public virtual string QuestionId { get; set; }

    public virtual string Title { get; set; }

    public virtual string Text { get; set; }

    public User User { get; set; }
    public string UserId { get; set; }
}

public class DB : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Question> Questions { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasMany(u => u.Questions)
            .WithRequired(q => q.User)
            .HasForeignKey(q => q.UserId)
            .WillCascadeOnDelete(false);
    }
}

Проблема в том, что конфигурирование ModelCreating таким образом дает мне эту ошибку:

System.Data.Edm.EdmAssociationType:: Кратность не действительна в роли 'Expert_Answers_Source' в отношения 'Expert_Answers'. Так как все свойства в зависимых Роли обнуляются, кратность Основная роль должна быть "0..1"

Что я делаю не так? Как я могу получить это?

Ответы [ 2 ]

1 голос
/ 10 марта 2011

Как говорит Ладислав, это невозможно, но вы можете попытаться обойти его, добавив дополнительное свойство User Id в класс Question (с соответствующим столбцом в вашей таблице вопросов) и назовите его как RefUserId или OriginalPoster, или что угодно. Вы бы заполнили это свойство вручную и не использовали бы его в качестве внешнего ключа .

Затем, перед удалением пользователя, просто установите для свойства User значение null в объекте Вопрос и удалите пользователя. Это должно оставить вопрос в базе данных без изменений, и у вас все равно будет ссылка на пользователя, который разместил вопрос.

1 голос
/ 10 марта 2011

Это невозможно. После того как вы определили внешний ключ, вы не можете удалить пользователя и все еще использовать его идентификатор. Если вы удаляете пользователя, его Id будет установлен в null в Question. Речь идет не об EF, а о ссылочной целостности в базе данных. Если вы не хотите, чтобы это произошло, вы не можете определить UserId в Question как внешний ключ. Если вы не определите его как внешний ключ БД, у вас не будет сопоставлено отношение в ваших сущностях.

...