В связи One-to-Many при попытке создать сущность со связью создается копия сущности

150
28 марта 2019, 04:40

Есть два класса Student:

public class Student
{
    public int Id { get; set; }
    [Required]
    [Display(Name = "Имя")]
    public string FirstName { get; set; }
    [Required]
    [Display(Name = "Фамилия")]
    public string LastName { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
}

И Post:

public class Post
{
    public int Id { get; set; }
    [Required]
    [DataType(DataType.Text)]
    [Display(Name = "Заголовок")]
    public string Header { get; set; }
    [Required]
    [DataType(DataType.MultilineText)]
    [Display(Name = "Текст поста")]
    public string Content { get; set; }
    [Display(Name = "Автор")]
    public virtual Student Author { get; set; }
    [Required]
    [DataType(DataType.DateTime)]
    public DateTime Created { get; set; }
    public Post()
    {
        Created = DateTime.Now;
    }
}

Для создания связей использую Fluent API:

public NewsStudentDbContext() :base("name=NewsStudent")
    { }
    public DbSet<Student> Students { get; set; }
    public DbSet<Post> Posts { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Student>().
            HasMany(a => a.Posts).
            WithRequired(a => a.Author);
    }
}

Создаю объект Post:

public ActionResult Create(Post post)
{
    var user = new Student()
    {
        Id = ((Student)Session["User"]).Id,
        FirstName = ((Student)Session["User"]).FirstName,
        LastName = ((Student)Session["User"]).LastName
    };
    post.Author = user;
    db.Posts.Add(post);
    db.SaveChanges();
    return RedirectToAction("Index");
}

Результат:

Students:

Posts:

Почему объект класса Student клонируется каждый раз когда создаётся новый пост?

Пожалуйста помогите понять.

Answer 1

Так вы каждый раз его заново создаёте. Не создавайте заново - раз. Для указания студента достаточно заполнить его Id - два.

Что-то в духе:

public void Create(string content, int authorId)
{
    var post = new Post
        {
           Content = content,
           AuthorId = authorId,
        };
    db.Posts.Add(post);
    db.SaveChanges();
}

Естественно, нужно проверять, что такой Id есть в базе.

И конечно же, у вас должно быть явно создано поле int AuthorId.

Вопрос очень похож на этот, почитайте возможно что-то ещё почерпнёте полезное.

READ ALSO
Создать класс прототип

Создать класс прототип

нужно создать класс-прототип для хранения и обработки экземпляров структур, наложить ограничение на параметр типа данных: элементы коллекции...

175
C# Spire.XLS как получить 0 при пустой ячейке

C# Spire.XLS как получить 0 при пустой ячейке

Я использовал 2 метода для получения значения ячейки(пустой и с цифрой): sheetGetText(row,cell) всегда дает пустую строку, а sheet

142
Освободить файл от процесса

Освободить файл от процесса

У меня есть круг и его заливка это картинка которая в папке \Resources\Images\При нажатии на нее пользователь может выбрать другую, которая будет...

251
Подмена метода C#

Подмена метода C#

Вопрос не нов, но в сети я не смог найти ответа к сожалениюВ общем ситуация следующая,у меня есть класс к примеру:

172