模型属性引用另一个模型 - 它是如何工作的?

时间:2015-08-02 16:21:03

标签: c# asp.net asp.net-mvc

我对ASP.NET MVC很新,但我对PHP了解得更多。因此,如果我在数据库中有2个连接表,通常我会用ID - 辅助密钥连接它们。

示例:

影:

 + ID
 + Title
 + Description
 + Genre

-- Comments --
 + ID
 + MoviesID
 + Comment

从而创造出一对多的关系。但我在ASP.NET MVC中看到人们会创建相互引用的模型:

public class Movie {
    // Annotations not included
    public int ID {get;set;}
    public string Title {get;set;}
    public string Description {get;set;}
    public string Genre {get;set;}
    public List<Comment> Comment {get;set;}
}

public class Comment {
    public int ID {get;set;}
    public Movie Movie {get;set;}
    public string Comment {get;set;}
}

所以一个模型调用另一个模型的部分,在数据库中看起来如何,如何在数据库中填充这些部分,如何将一个注释/电影类的值传递给另一个类的数据库时你想创建一个新行吗? (如果这是有道理的 - 例如,当你在数据库中上传新的评论时,如何在数据库中插入一个电影对象。)或者至少你可以给我一些资料来阅读它,因为我什么都没发现。

当然,另一个问题是,如果这样做很聪明,或者你应该这样做,传统的&#34;方式,遵循我在顶部做的模式?

希望它是可以理解的,谢谢!

1 个答案:

答案 0 :(得分:1)

你所指的是一个ORM,它代表对象关系映射。

基本上,ORM可以帮助您将表和它们之间的关系视为对象。这种方法使编程在代码和数据库的通用语言方面更加容易。

ORM工具也广泛用于PHP(搜索Proper,Doctrine)。对于C#,您可以参考NHibernate,Entity Framework或像Dapper这样的微ORM。您作为.NET方法提供的示例与您在PHP中的方法类似。唯一的区别是你明确地将一个属性标记为外键。您可以将示例更改为:

public class Movie {
   //Annootations not included
   public int ID {get;set;}
   public string Title {get;set;}
   public string Description {get;set;}
   public string Genre {get;set;}
   public List<int> CommentIds {get;set;}
}

public class Comment {
   public int ID {get;set;}
   public int MovieID {get;set;}
   public string Comment {get;set;}
}

但这只会加载相关记录的标识符。使用ORM时,您可以将属性(在表中是另一个表记录的标识符)标记为强类型类,这使您可以从数据库加载其所有数据。

简而言之 - 在使用ORM时,您可以在从数据库中提取Movie时加载整个Comment,而不仅仅是其标识符。

整个过程及其配置取决于您使用的ORM工具,您可以使用映射属性(例如,在Entity Framework中)或流畅的映射(当使用NHibernate与Fluent NHibernate时)。这些工具非常复杂(需要解决许多问题 - 急切/延迟加载,连接管理,会话管理,LINQ to Entities等等,不可能在SO上解释它)。)