我写了一个如下工作的应用程序:
我上面描述的内容有效,但不是我想要的。假设我有名为Jarek和Damian的用户。他们每个人都会将具有相同标题的电影粘贴到解析器中,例如。 “Obecność”(英语“The Conjuring”)。目前,在数据库中将发生类似这样的事情:
因为重复有关电影的所有数据没有任何意义,因为它们是相同的,只需将新用户添加到分配给特定电影的字段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);
}
但是要用什么代替问号呢?我在某处弄错了,但我不知道在哪里。我详细地写了它,因为我试图理解它。
答案 0 :(得分:2)
为什么不从电影表中删除用户名。相反,在用户和电影表之间创建一个单独的链接表,如下所示:
UserFilm
user_id | film_id
1 | 203
3 | 203
3 | 208
1 | 209
这样任何用户都可以拥有多部电影,而且有2位用户可以共享同一部电影。这就是您的SQL数据库所需要的,以支持您提到的代码类型以及多对多关系。
如果你喜欢这个解决方案的外观,我很高兴在午餐时看看你的代码。虽然我相信其他人会在此之前进一步帮助你。
祝你好运