面向对象数据库:N:M 关系
本文关键字:关系 面向对象数据库 | 更新日期: 2023-09-27 18:34:46
我正在做一个项目,这让我感到困惑。我有 2 张桌子,电影(电影(和演员(atores(,一部电影有很多演员,反之亦然,演员有很多电影。
我声明每个表如下:
电影(电影(:
[ScaffoldColumn(false)]
public int id { get; set; }
public string NomeFilme { get; set; }
public virtual ICollection<Ator> atores { get; set; }
演员(阿托雷斯(:
[ScaffoldColumn(false)]
public int id { get; set; }
public string Nome { get; set; }
public virtual ICollection<Filme> filmes { get; set; }
现在,我正在使用一些值初始化数据库。电影表有这个:
var filmes = new List<Filme> {
new Filme {
NomeFilme = "Harry Potter - Part II",
}
};
演员表有:
var lista = new List<Ator> {
new Ator {
Nome = "Emma Watson"
},
new Ator {
Nome = "Daniel Radcliffe",
filmes = GetMovies()
}
};
所以,我正在做的应该是制作一部哈利波特电影并添加 2 名演员。雷德克里夫应该在他的电影名单中加入哈利波特。
我发现的第一个问题是我的电影表中有 2 部哈利波特电影。我猜是因为我调用"filmes = GetMovies((",并且该函数再次创建电影。我想也许我必须使用DB ProductContext和类似的东西
context.Filmes.ElementAt(0)
但我仍然需要做一个"新列表",当我尝试它时,我得到了一个例外。所以,我的第一个问题是:如何将影片添加到我的演员和演员到我的电影而不重复?(我必须像SQL一样做并创建一个新表吗?O.o(
其次,在我的网页中的某个地方,我试图访问这些值。即使有重复,我也尝试了这样的事情:
IQueryable<Ator> temp = _db.Atores;
foreach (var t in temp)
{
System.Diagnostics.Debug.Write("actor:" + t.Nome);
foreach (var p in t.filmes)
{
System.Diagnostics.Debug.Write("OMFG IT WORKED " + p.NomeFilme);
}
}
现在我打印好演员的名字后,System.Data.EntityCommandExecutionException"类型的第一次机会异常发生在System.Data.Entity中.dll
我找不到有关导致它的原因的更多信息。我是否访问了错误?为什么它对演员有效,但对电影却崩溃?我感到很迷茫!
"如何将电影添加到我的演员和演员到我的电影中而不重复?
我像SQL一样做了它,这是另一个带有MovieID和ActorID的表。我忽略了虚拟 IColletions,只有指向这些 ID 的整数。
--
使用这种新方法,遍历值变得更加容易,但我仍然无法在 Iqueriable 中选择值以返回到我的 ASPX 页面。我发现的简单方法是将每个IQueriable转换为列表(使用.toList(((并从那里开始工作。像魅力一样工作!