【问题标题】:C# Foreign key Can't add object to list of objectsC#外键无法将对象添加到对象列表
【发布时间】:2020-06-22 08:27:23
【问题描述】:

我有 2 个模型类电影和客户。我制作了一对多外键,以便可以将电影添加到客户列表中。但现在我无法向客户添加电影,也没有出现任何错误。

这是我的代码。

电影课

public class Movie
{
    [Key]
    public int MovieId { get; set; }
    public String Name { get; set; }

    [Column(TypeName = "datetime2")]
    public DateTime? DateCreated { get; set; }

    public int? CustomerId { get; set; }
    public Customer Customer { get; set; }
}

客户类别

public class Customer
{
    [Key]
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public string LastName { get; set; }
    public bool IsCreated { get; set; }
    public int MaxMovies { get; set; }

    [Column(TypeName = "datetime2")]
    public DateTime Created { get; set; }

    [Column(TypeName = "datetime2")]
    public DateTime? LastEdited { get; set; }

    [ForeignKey("MovieId")]
    public List<Movie> Movies = new List<Movie>();
}

这是我的CustomerController 类中的代码,应该将电影添加到我的客户

[HttpGet]
public IActionResult AddMovie(int id)
{
    List<Movie> movieList = new List<Movie>();
    movieList = dbContext.Movies.ToList();

    AddMovieViewModel viewModel = new AddMovieViewModel()
    {
        movies = movieList,
        customer = dbContext.Customers
           .Where(s => s.CustomerId == id)
           .FirstOrDefault()
    };

    return View(viewModel);
}

[HttpPost]
public IActionResult AddMovie (int id,int cid)
{
    Customer customer = dbContext.Customers
        .Where(s => s.CustomerId == cid)
        .FirstOrDefault();
    Movie movie = dbContext.Movies
        .Where(s => s.MovieId == id)
        .FirstOrDefault();
    movie.CustomerId = customer.CustomerId;
    customer.Movies.Add(movie);

    dbContext.SaveChanges();
    return RedirectToAction("Index");
}

我希望有人能告诉我我的代码有什么问题。

【问题讨论】:

  • 为什么您认为您的代码有问题?您能否告诉我们您遇到了哪个编译器错误或异常,以及您在哪一行得到它?
  • 另外,您似乎正在加载现有电影,更改其上的客户 ID,然后将其保存回来。这不会创建新电影,而是会更新现有电影。这可能是问题吗?
  • 在我看来,它显示了客户的电影数量,但始终为 0
  • @LasseV.Karlsen 是的,就是这样,但我尝试制作一部新电影并添加它,但我找不到这样做的方法。

标签: c# asp.net-core-mvc


【解决方案1】:

我相信这是您正在寻找的模型结构

客户

public class Customer
{

    [Key]
    public int CustomerId { get; set; }

    public string Name { get; set; }
    public string LastName { get; set; }
    public bool IsCreated { get; set; }
    public int MaxMovies { get; set; }

    [Column(TypeName = "datetime2")]
    public DateTime Created { get; set; }

    [Column(TypeName = "datetime2")]
    public DateTime? LastEdited { get; set; }

    public ICollection<Movie> Movies = new List<Movie>();

}

电影

public class Movie
{

    [Key]
    public int MovieId { get; set; }

    public String Name { get; set; }

    [Column(TypeName = "datetime2")]
    public DateTime? DateCreated { get; set; }

    [ForeignKey("Customer")]
    public int? CustomerId { get; set; }

    public Customer Customer { get; set; }

}

然后在创建/编辑电影时,只需为电影分配一个 CustomerId,然后您就可以通过访问 Customer.Movies 检索客户的电影

【讨论】:

    【解决方案2】:

    您不是在创建新的Movie,而是在搜索现有的电影。所以创建新电影并分配CustomerId

    Customer customer = dbContext.Customers
        .Where(s => s.CustomerId == cid)
        .FirstOrDefault();
    Movie movie = new Movie();
    movie.CustomerId = customer.CustomerId;
    movie.Name = "My new movie";
    movie.DateCreated = DateTime.Now;
    
    dbContext.Customers.Add(customer);
    dbContext.Movies.Add(movie);
    
    dbContext.SaveChanges();
    

    EntityFramework 将插入一个新实体。

    【讨论】:

    • 电影的MovieId为0,不添加到列表中。
    • 嗨,很抱歉迟到了,但我现在收到此 sql 错误“SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'Customers' 中插入标识列的显式值。”
    • 好吧,现在发生的事情就是这样。新电影已创建但未添加到列表中,所以现在当我查看所有电影时它是空的。
    • 是的,它确实创建了一个带有 id 但没有别的东西的新的。
    • @remco 只需创建a junction table
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多