【问题标题】:Initiating objects with mutual dependency启动相互依赖的对象
【发布时间】:2011-08-18 21:09:57
【问题描述】:

我正在尝试对电影数据库中的实体进行建模。我的电影有导演名单,导演有电影名单。我制作的对象是这样的:

public class eFilm
{
    //Basic properties
    public int ID { get; private set; }
    public string Title { get; set; }
    public DateTime? Date { get; set; }

    public List<eDirector> Directors = new List<eDirector>();
    public List<eActor> Actors = new List<eActor>();
    public eMedia_Type Type;

    /// <summary>
    /// Initiate a new Films from Films_Data object
    /// </summary>
    /// <param name="Film">Films_Data object from which to initiate a new film</param>
    public eFilm(Film Film)
    {
        this.ID = Film.ID;
        this.Title = Film.Title;
        this.Date = Film.Date;
        this.Synopsis = Film.Synopsis;

        //Add directors
        Film.Films_Directors.Select(fd => fd.Director).ToList<Director>().ForEach(d => this.Directors.Add(new eDirector(d)));
        //Add actors
        Film.Films_Actors.Select(fa => fa.Actor).ToList<Actor>().ForEach(a => this.Actors.Add(new eActor(a)));
        //Add type
        this.Type = new eMedia_Type(Film.Media_Type);
    }
}

public class eDirector
{
    public int ID { get; private set; }
    public string Name{ get; set;}

    public List<eFilm> Films = new List<eFilm>();

    public eDirector(Director Director)
    {
        this.ID = Director.ID;
        this._Name = Director.Name;

        _Number_Of_Films = Director.Films_Directors.Select(d => d.Film).ToList<Film>().ForEach(f => this.Films.Add(new eFilm(f)));
    }
}

为简洁起见,我省略了一些内容。这给了我一个堆栈溢出,因为我将导演添加到电影中,然后将电影添加到导演中,然后将导演添加到电影中等等。 我想不出一种方法来对此进行建模,但显然必须有某种方法可以做到这一点,因为实体框架可以......

任何关于如何进行的建议将不胜感激。

编辑:可能需要一些信息。我这样做是为了在 Linq-to-SQL 生成的类之上添加一个层,以使我能够在将数据传递到存储库以进行持久性之前对数据执行一些检查。我正在使用 c# 和 ASP.NET MVC。

【问题讨论】:

  • 顺便说一句,您可以在 Linq2Sql 生成的类中执行额外的检查,因为它们是部分实现的,并且您可以实现部分方法来获取更改。
  • 谢谢,我最初就是这么做的。我想我会远离那个,因为我最终复制了每一个属性并且命名开始变得非常痛苦。如果没有其他办法,我可能会回到那个位置......

标签: c# oop linq-to-sql entity-framework-4


【解决方案1】:

你所做的是一个无限循环,电影添加导演添加电影直到它抛出 StackOverflowException,实体框架“可以”这样做的原因是因为默认情况下实体框架正在执行所谓的延迟加载,这意味着当您访问董事列表时,它会调用数据库并获取它们,您的实体现在的方式但是它们将急切加载,因为 virtual 关键字用于让实体框架进行延迟加载。

我的建议是,如果你想模仿实体框架的行为是这样的:

public class Film {
    ...
    public readonly IEnumerable<Director> Directors = _repository.GetDirectors(this.iD);
}

然后您将在 Director 类中添加一个类似的属性,这样您只在需要时获取数据,它不会执行无限循环来急切加载所有内容。

【讨论】:

  • 啊,我明白了,实际上我只在需要时才获得所需的数据层。我会试试看。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 2014-07-27
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
相关资源
最近更新 更多