昨天我在 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 个表,但我有一些问题......我想在 GameModel 中创建 CreatorId,但它不起作用......当我写 UserId 而不是 CreatorId 它正在工作(没有 [InverseProperty("Id ")] 和 [ForeignKey("CreatorId")])。

这就是我得到的:



编辑:
我把它改成这样:
    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; }

还有另一个问题。



我不知道如何解决它。

最佳答案

InversePropertyAttribute 指定应该为该关系使用哪个导航属性。

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

因此,如果您将类型更改为 GameModel.Creator 或必须未指定,则 UserModel.Games 的逆属性可能是 ICollection<GameModel> 。如果您不指定反向属性,EF 将尝试自行解决所有问题(在这种情况下,它会将 GameModel.Creator 正确识别为导航属性,但 UserModel.Games 很可能会引发异常,因为它既不是实体类型,也没有实现 ICollection<T> ,其中 T 作为实体类型,从数据库的角度来看也不是原始类型)。然而,EF 的 work-everything-out-by-itself-magic 并不能很好地处理相同实体类型之间的多个关系,这就是需要 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 知道它必须生成从 SomePrettyImportantStuffOtherImportantStuff 的 2 个 FK,名称分别为 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);
}

关于c# - Entity Framework Code First 中的关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20202578/

10-11 03:55