实体框架代码中的关系首先

Rem*_*emi 4 c# entity-framework foreign-keys code-first

昨天我在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; }
}
Run Code Online (Sandbox Code Playgroud)

现在我想创建4个表但是我有一些问题...我想在GameModel中创建CreatorId,但是它不起作用...当我写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; }
Run Code Online (Sandbox Code Playgroud)

还有另一个问题.

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

我不知道如何解决它.

Nuf*_*fin 9

InversePropertyAttribute指定,其导航属性应该用于这层关系.

导航属性必须是实体类型(GameModel例如,在模型中声明的类型)或某种类型实现ICollection<T>,其中T必须是实体类型.UserModel.Id是一个int,显然不满足这个条件.

因此,如果您将类型更改为,或者必须保持未指定,则反向属性GameModel.Creator可能是.如果你没有指定反向属性,EF会尝试自己解决所有问题(在这种情况下,它会正确识别为导航属性,但很可能抛出异常,因为它既不是实体类型,也不是做它实现与作为一个实体型,也不是从一个数据库点基本类型).然而,EF的工作 - 一切都是自己的魔法 - 并不能很好地应对相同实体类型之间的多重关系,这是需要的时候.UserModel.GamesICollection<GameModel>GameModel.CreatorUserModel.GamesICollection<T>TInversePropertyAttribute

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

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; }
}
Run Code Online (Sandbox Code Playgroud)

在这里,EF知道它有产生2个FKS SomePrettyImportantStuffOtherImportantStuff与名称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);
}
Run Code Online (Sandbox Code Playgroud)