Code First实体框架和外键

3

假设我有一个由Code First创建的数据库,看起来像这样。

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;}
}

数据库优先(Database first)可以让我从演员查询电影,同时还能设置演员的外键属性来更新数据库。但是在代码优先(Code first)中,由于模型中只有对象而没有外键,所以我无法这样做。如果我知道电影的ID,我更愿意直接设置外键,而不必获取电影对象并设置属性。
明白了吗?哈哈
我想使用Code First和实体迁移,但我希望像数据库优先一样可以在对象上设置外键。
感谢您的帮助 :-D

1
我无法在Code First中完成此操作,因为外键不在模型中。这是Code First - 将其添加到您的模型中!一些开发人员喜欢外键,而有些则不喜欢 http://msdn.microsoft.com/en-us/magazine/hh708747.aspx - Colin
我知道你可以将它添加到你的模型中,但是迁移会创建重复的键。 - Rob White
1个回答

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; }
 }

按照约定,EF将知道MovieID是指向Movie的外键。

然后将Actor代码更改为以下内容:

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

演员出现在许多电影中。电影有很多演员......:-)
但是回到你的一对多关系,其中一个演员只出现在一部电影中 - 如果你真的想让外键成为Move_ID,那么添加一个数据注释
[ForeignKey("Move_ID")]
Movie Movie{ get; set; }

或者使用FluentAPI进行配置。

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

我应该提到这不是一个真正的场景,如果我想要一个电影数据库,你是正确的。演员可以出现在许多电影中,我喜欢这个额外的想法。那么唯一的区别是什么?我最近开始使用Orchard和_,我认为那里是传统。 - Rob White
不,你还需要将“Move”部分中的“i”放回去,变成“MovieID”。或者你可以在所有地方使用“ID”。这些都在我提供链接的入门页面中。请前往阅读http://msdn.microsoft.com/en-us/data/ee712907 - Colin
作为一个敏感的人,也许我在你的回复中读到了一些可能存在或不存在的恼怒。但是你的答案非常准确。我在我的模型中添加了外键而没有使用下划线,它运行得非常出色。好极了! - Rob White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接