2013-11-15 67 views
1

想象一下,我有一个由代码创建的数据库,看起来像这样。代码第一个实体框架和外键

Movie (table) 
ID int PK 
MoveiName nvarchar(100) 

Actor (table) 
ID int PK 
ActorName nvarchar(100) 
Movie_ID int FK 

这些是我会用到的模型,显然不完全像这样,但你会明白我的观点。

class Movie 
{ 
    int ID{get;set;} 
    string MovieName {get;set;} 
    List<Actor> Actors {get;set} 
} 

class Actor 
{ 
    int ID{get;set} 
    string Actorname{get;set} 
    Movie Movie{get;set;} 
    int Move_ID{get;set;} 
} 

数据库首先使我能够从演员查询电影,但也可以让我设置演员的forgien键属性来更新数据库。我不能在代码中做到这一点,因为外键不是只在模型中的对象。我宁愿不要获取Movie对象并设置属性,如果我知道我的电影的id,我宁愿只设置外键而不打电话来获取电影。

有意义吗?大声笑

我想使用codefirst和实体的迁移,但我想要的数据库相同的能力首先设置一个对象的外键。

干杯的帮助:-D

+1

配置它“我不能在代码首先做的原因是外键是不是模型”。这是代码第一 - 将其添加到您的模型!一些开发人员不喜欢外键,有些是http://msdn.microsoft.com/en-us/magazine/hh708747.aspx – Colin

+0

我知道你可以将它添加到你的模型,但是然后迁移创建重复键 –

回答

7

首先改变你的代码,这

public class Movie 
{ 
    int ID{ get; set; } 
    string MovieName {get; set; } 
    List<Actor> Actors {get; set; } 
} 

public class Actor 
{ 
    int ID{get;set} 
    string ActorName{ get; set } 
    Movie Movie{ get; set; } 
    int MovieID{ get; set; } 
} 

通过convention EF就知道MovieID是外键Movie

然后换Actor代码这个:

public class Actor 
{ 
    int ID{get;set} 
    string ActorName{ get; set; } 
    Movie Movies{ get; set; } 
} 

演员出现在许多电影中。电影有很多演员.... :-)

但回到你一到那里的许多演员只出现在一部电影 - 如果你真的想要的外键是Move_ID然后添加一个data annotation

[ForeignKey("Move_ID")] 
Movie Movie{ get; set; } 

或者使用FluentAPI

modelBuilder.Entity<Actor>() 
       .HasRequired(c => c.Movie) 
       .WithMany(d => d.Actors) 
       .HasForeignKey(c => c.Move_ID); 
+0

我应该提到这不是一个真正的scenerio,如果我想要一个电影数据库,你是对的。演员可以在我喜欢额外想法的许多电影中。唯一的区别是_?我最近开始使用果园,而且我认为这是在那里召开的。 –

+0

不,您还必须将“我”放回“移动”部分才能将其转换为“MovieID”。或者,您可以在任何地方使用“ID”。这些都在我链接到的入门页面中。请阅读http://msdn.microsoft.com/en-us/data/ee712907 – Colin

+0

是一个敏感的灵魂,我可能会在您的回复中读到一些令人烦恼的东西,这些回复可能存在也可能不存在。然而你的答案是现货。我在没有_的情况下将外键加回到我的模型上,并且它运行得非常出色。好人。 –

相关问题