我刚刚开始使用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);
}
任何提示都将不胜感激。
答案 0 :(得分:1)
显然,您希望在Fixture
和Result
之间建立一对一的关系(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
属性。其他所有内容都将根据约定自动映射。