2015-10-06 50 views
1

我不知道实体框架如何知道要连接的表的基础上,下面的代码:的DbContext类ASP.Net MVC

public class Movie 
    { 
     public int ID { get; set; } 
     public string Title { get; set; } 
     public DateTime ReleaseDate { get; set; } 
     public string Genre { get; set; } 
     public decimal Price { get; set; } 
    } 

    public class MovieDBContext : DbContext 
    { 
     public DbSet<Movie> Movies { get; set; } 
    } 

Source

我知道,在默认情况下它连接到的LocalDB 。我可以指定该数据库中添加一个条目来连接到Web.config文件,像这样:

<add name="MovieDBContext" 
    connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Movies.mdf;Integrated Security=True" 
    providerName="System.Data.SqlClient" 
/> 

现在,MovieDBContext类有一个Movies属性。我可以改变它的名字而不破坏任何事件吗?或者这个名字被框架用来知道要查询哪个表?

如果我没有将以上代码添加到Web.config文件中,该怎么办?它会根据属性的名称自动创建一个Movies.mdf表吗?

+0

EF连接到数据库,而不是表格。在名为“Movies”的数据库中,您将拥有一个名为Movie的表格,因为您有一个DbSet。名称电影可以改变,如果你喜欢,但那是惯例。 –

+0

表名应该是实体名称的插件。表'汽车'包含'汽车'实体。所以电影表将被创建。我希望这是你的意思。 – user107986

+0

@Steve Greene:默认情况下,EF使用'PluralizingTableNameConvention',所以表名将是“Movies” – Vova

回答

0

如果您是代码优先方法,您可以更改Movies属性的名称。实体框架使用类名称(在这种情况下为class Movie)来确定表名。

默认情况下,它使用以下约定:从类名称复数并尝试在数据库中查找此类表。

关于数据库名称:即使没有连接字符串,EF也会尝试创建数据库,但会给它一个不同的名称(例如WebApplication1.MovieDBContext)。

+0

顺便说一句,你有任何MS页面说这个?我无法在任何地方找到它。 – user107986

+1

看到这个问题:http://stackoverflow.com/questions/10512900/list-of-entity-framework-code-first-default-naming-conventions 还有MSDN链接: https:// msdn。 microsoft.com/en-us/data/jj679962 - 请参阅底部的示例。 https://msdn.microsoft.com/en-us/library/system.data.entity.modelconfiguration.conventions(v=vs.103).aspx – Vova

-1

如果您的数据库已经使用EF刷新,可能会发生错误。因此,请尝试将新命名的类显式映射到表。

+0

即使数据库是由EF创建的,它仍然使用类名然后DbSet属性名称.. – Vova

+0

它使用召集,所以如果它不能匹配类名到表名会发生什么? –

+0

EF将抛出异常: 自创建数据库以来,支持'MovieDBContext'上下文的模型已更改。考虑使用Code First Migrations来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。 – Vova