将新用户分配给数据库中的电影

时间:2018-03-20 10:21:32

标签: c# entity-framework asp.net-core asp.net-identity automapper

我写了一个如下工作的应用程序:

  1. 用户创建帐户并登录。
  2. 用户在相应字段中粘贴Filmweb.pl数据库中电影的链接。
  3. 应用程序解析链接,并将收到的结果(如:directing,description,cover等)添加到应用程序数据库中。
  4. 依此类推:用户可以将链接粘贴到另一部电影(如果之前没有添加过标题),则会重复解析过程。
  5. 我上面描述的内容有效,但不是我想要的。假设我有名为Jarek和Damian的用户。他们每个人都会将具有相同标题的电影粘贴到解析器中,例如。 “Obecność”(英语“The Conjuring”)。目前,在数据库中将发生类似这样的事情:

    http://funkyimg.com/i/2Dnfd.jpg

    但我希望有类似的东西: http://funkyimg.com/i/2DnfR.jpg

    因为重复有关电影的所有数据没有任何意义,因为它们是相同的,只需将新用户添加到分配给特定电影的字段UserName即可。唯一的问题是如何做到这一点?

    我的应用程序的完整代码可在此处找到: https://bitbucket.org/DamianOS_MP5/filmwebparser-old-version

    我在某处读到了我需要创建多对多关系的地方。我向Film类添加了一个属性:

    public List<FilmUser> FilmUserList { get; set; }
    

    FilmUser类属性和构造函数:

    public List<Film> FilmList { get; set; }
    
    public FilmUser(string name)
    {
        IdentityUser user = new IdentityUser(name);
    }
    

    然后我改变方法,例如AddFilm:

    public string AddFilm(Film film)
    {
        if (film.Title == null)
            return "W podanym linku nie wykryto filmu.";
        else if (!_context.Films.Any(t => t.Title == film.Title && t.UserName == film.UserName))
        {
            _context.Add(film);
            return string.Empty;
        }
        else
            return "Podany film znajduje się już w bazie.";
    }
    

    为:

    public string AddFilm(Film film)
    {
        if (film.Title == null)
            return "W podanym linku nie wykryto filmu.";
        else if (!_context.Films.Any(t => t.Title == film.Title))
        {
            film.FilmUserList.Add(new FilmUser(film.UserName));
            _context.Add(film);
            return string.Empty;
        }
        else
        {
            if (!_context.Films.Any(t => t.FilmUserList.Contains(new FilmUser(film.UserName))))
            {
                film.FilmUserList.Add(new FilmUser(film.UserName));
                _context.Update(film);
                return string.Empty;
            }
            else
                return "Podany film znajduje się już w bazie.";
        }
    }
    

    所以下一步是创建一个新的迁移。这是错误:

      

    无法确定导航所代表的关系   属性'Film.FilmUserList'类型'List'。手动   配置关系,或从模型中忽略此属性。

    使用示例https://docs.microsoft.com/en-us/ef/core/modeling/relationships#many-to-many我写道:

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Film>()
            .HasKey(s => new { s.??? });
        base.OnModelCreating(builder);
    }
    

    但是要用什么代替问号呢?我在某处弄错了,但我不知道在哪里。我详细地写了它,因为我试图理解它。

1 个答案:

答案 0 :(得分:2)

为什么不从电影表中删除用户名。相反,在用户和电影表之间创建一个单独的链接表,如下所示:

UserFilm

user_id | film_id
    1   |   203
    3   |   203
    3   |   208
    1   |   209

这样任何用户都可以拥有多部电影,而且有2位用户可以共享同一部电影。这就是您的SQL数据库所需要的,以支持您提到的代码类型以及多对多关系。

如果你喜欢这个解决方案的外观,我很高兴在午餐时看看你的代码。虽然我相信其他人会在此之前进一步帮助你。

祝你好运