2013-10-10 40 views
0

我正在开发一个项目,这只是让我困惑不已。我有2张表,电影(电影)和演员(atores),一部电影有很多演员,反之亦然,演员有很多电影。面向对象的数据库:N:M关系

我声明的每个表如下:

电影(Filmes):

[ScaffoldColumn(false)] 
    public int id { get; set; } 

    public string NomeFilme { get; set; } 

    public virtual ICollection<Ator> atores { get; set; } 

演员(Atores):

[ScaffoldColumn(false)] 
    public int id { get; set; } 

    public string Nome { get; set; } 

    public virtual ICollection<Filme> filmes { get; set; } 

现在,我初始化DB一些值。该电影表有这样的:

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个HarryPotter电影。我猜它是因为我打电话“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

我无法找到有关导致它的更多信息。我访问错了吗?它为什么对演员有效,但对电影崩溃?我感觉很迷茫!

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

回答

0

“我如何向我的演员和演员添加电影到我的电影没有重复?”

我做了它像SQL,另一个表与MovieIDs和ActorIDs。我忽略了虚拟IColletions,只是指向这些ID的int。

-

有了这个新的方法,在整个价值迭代变得轻松了很多,但我还是遇到了一些麻烦选取数值到我Iqueriable回到我的ASPX页面。最简单的方法,我发现只是每IQueriable和工作转换到一个列表(()与.toList)从那里。奇迹般有效!