2013-11-25 78 views
4

昨天我在Management Studio中创建了数据库,现在我想使用EF Code First在程序中创建它。实体框架代码中的关系首先

这里是链接到我的数据库:http://s11.postimg.org/6sv6cucgj/1462037_646961388683482_1557326399_n.jpg

而我所做的:

public class GameModel 
{ 
    [Key] 
    public int Id { get; set; } 

    public string Name { get; set; } 
    public DateTime CreationTime { get; set; } 
    public DateTime StartTime { get; set; } 
    public DateTime EndTime { get; set; } 
    public string TotalTime { get; set; } 
    public DateTime RouteStartTime { get; set; } 
    public DateTime RouteEndTime { get; set; } 
    public int MaxPlayersPerTeam { get; set; } 

    public int CityId { get; set; } 
    public int CreatorId { get; set; } 
    [InverseProperty("Id")] 
    [ForeignKey("CreatorId")] 
    //public int TeamId { get; set; } 
    //[ForeignKey("TeamId")] 

    public virtual UserModel Creator { get; set; } 
    public virtual CityModel City { get; set; } 
    //public virtual TeamModel WinnerTeam { get; set; } 


} 
public class RegionModel 
{ 
    [Key] 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public virtual ICollection<CityModel> Cities { get; set; } 
} 
public class CityModel 
{ 
    [Key] 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public int RegionId { get; set; } 

    public virtual RegionModel Region { get; set; } 

    public virtual ICollection<UserModel> Users { get; set; } 
    public virtual ICollection<GameModel> Games { get; set; } 
} 
public class UserModel 
{ 
    [Key] 
    public int Id { get; set; } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Login { get; set; } 
    public string Password { get; set; } 
    public string Email { get; set; } 
    public DateTime RegistrationDate { get; set; } 
    public string FacebookId { get; set; } 

    public int CityId { get; set; } 

    public virtual CityModel City { get; set; } 

    public virtual IEnumerable<GameModel> Games { get; set; } 
} 

现在我想创建4个表,但我有一些问题......我想打的的creatorID GameModel,但它不工作...当我编写UserId而不是CreatorId时,它工作(没有[InverseProperty(“Id”)]和[ForeignKey(“CreatorId”)])。

这就是我得到:

视图“属性‘ID’不能被配置为导航属性。该属性必须是有效的实体类型,并且该属性应该具有非抽象的getter和setter。对于集合属性,类型必须实现ICollection,其中T是有效的实体类型。或者其主人没有被发现或者没有视图引擎支持搜索到的位置。

编辑: 我改成了这样:

public int CityId { get; set; } 
    public int CreatorId { get; set; } 

    [ForeignKey("CityId")] 
    public virtual CityModel City { get; set; } 
    [ForeignKey("CreatorId")] 
    public virtual UserModel Creator { get; set; } 

而且,还有另一个问题。

视图‘上表‘UserModels“引入外来KEY约束’FK_dbo.UserModels_dbo.CityModels_CityId’可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 无法创建约束。查看以前的错误。'或者其主人没有被发现或者没有视图引擎支持搜索到的位置。

我不知道如何解决它。

回答

8

InversePropertyAttribute指定,其中导航属性应该用于该关系。

导航属性必须是实体类型(在模型中声明的类型,GameModel为例)或某些类型的实施ICollection<T>,其中T必须是实体类型的。 UserModel.Idint,显然不符合该条件。

因此,如果您将类型更改为ICollection<GameModel>或必须保持未指定状态,则GameModel.Creator的逆性质可能为UserModel.Games。如果您没有指定反转属性,则EF将尝试自行处理所有事务(在这种情况下,它将正确识别GameModel.Creator作为导航属性,但UserModel.Games很可能会抛出异常,因为它既不是实体类型也不实施ICollection<T>,其中T是实体类型,也不是从数据库角度来看的基本类型)。然而,英孚的工作魔力并不能很好地处理相同实体类型之间的多重关系,这就是当需要InversePropertyAttribute时。

一个简单的例子演示该问题:

class SomePrettyImportantStuff { 
    [Key] 
    public int ID { get; set; } 

    public int OtherId1 { get; set; } 

    public int OtherId2 { get; set; } 

    [ForeignKey("OtherId1")] 
    public virtual OtherImportantStuff Nav1 { get; set; } 

    [ForeignKey("OtherId2")] 
    public virtual OtherImportantStuff Nav2 { get; set; } 
} 

class OtherImportantStuff { 
    [Key] 
    public int ID { get; set; } 

    public virtual ICollection<SomePrettyImportantStuff> SoldStuff { get; set; } 

    public virtual ICollection<SomePrettyImportantStuff> BoughtStuff { get; set; } 
} 

这里,EF知道它有产生从SomePrettyImportantStuff 2个FKS到OtherImportantStuff与名称Id1Id2,但它没有办法知道其中这些ID是指它从哪个实体出售,哪个实体是从哪个实体购买的。

编辑:如何解决循环引用问题

为了解决这个问题,你的上下文类应重写OnModelCreating和配置不应该对级联删除相应的外键,这样的:

protected override void OnModelCreating(DbModelBuilder builder) 
{ 
    builder.Entity<CityModel>().HasMany(c => c.Users).WithRequired(u => u.City) 
      .HasForeignKey(u => u.CityId).WillCascadeOnDelete(value: false); 

    // Add other non-cascading FK declarations here 

    base.OnModelCreating(builder); 
} 
+0

感谢您的回复。我编辑我的帖子,因为我有另一个问题。请看看它 – Remi

相关问题