实体框架约定

时间:2013-06-18 22:04:35

标签: entity-framework naming-conventions poco conventions

我刚刚开始使用Entity框架并创建了我的Repository和上下文类和接口并定义了我的POCO,我现在正试图理解这些约定是如何工作但是有困难而且到目前为止一直无法做到如此。

我有以下2个POCO课程:

游戏周期

public class Gameweek
{
    [Key][Required]
    public int GameweekID { get; set; }

    [Required]
    public DateTime StartDate { get; set; }

    [Required]
    public DateTime Deadline { get; set; }

    [Required]
    public int NumberFixtures { get; set; }

    public virtual ICollection<Fixture> Fixtures { get; set; }

    public virtual ICollection<Result> Results { get; set; }
}

夹具

public class Fixture
{
    [Key][Required]
    public int FixtureID { get; set; }

    [Required]
    public int GameweekID { get; set; }

    [Required]
    public string HomeTeam { get; set; }

    [Required]
    public string AwayTeam { get; set; }

    public virtual Result Result { get; set; }
}

结果

public class Result
{
    [Key][Required]
    public int FixtureID { get; set; }

    [Required]
    public int HomeGoals { get; set; }

    [Required]
    public int AwayGoals { get; set; }
}

在我的模型中, Gameweek 可以包含0-20个灯具。游戏周中的每个夹具都有一个结果

我是否通过课程和以下对话正确​​建模:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove < PluralizingTableNameConvention>();

        //Table relationships defined here
        modelBuilder.Entity<Gameweek>()
            .HasMany(g => g.Fixtures);                  

        modelBuilder.Entity<Fixture>()
            .HasOptional(f => f.Result);                    

    }

任何提示都将不胜感激。

1 个答案:

答案 0 :(得分:1)

显然,您希望在FixtureResult之间建立一对一的关系(Result个实体不能在多个Fixture之间共享,对吧?在这种情况下,您的映射不是100%正确。你需要:

modelBuilder.Entity<Fixture>()
    .HasOptional(f => f.Result)
    .WithRequired();

如果你不添加WithRequired EF约定将假设WithMany,即一对多而不是一对一的关系。

说到约定,您实际上可以删除modelBuilder.Entity<Gameweek>().HasMany(g => g.Fixtures);中的[Required]所有 [Key]属性和Gameweek属性。只需要上面的一对一映射和[Key]上的Result.FixtureID属性。其他所有内容都将根据约定自动映射。