我的班级有这个属性:团队
[Key]
public virtual long Id { get; set; }
public Guid ClubIdentifier { get; set; }
public GenderEnum Gender { get; set; }
public TeamAgeCategoryEnum TeamAgeCategory { get; set; }
public ICollection<int> BirthYears { get; set; }
如何将属性BirthYears中的内容保存到我的数据库,我让EF根据模型创建我的数据库,但属性BirthYears在我的数据库中被遗漏。我原本期望一个新表保存int值和我的Team Id值。
我错过了什么,我想我需要在我的存储库类中做一些OnModelCreating方法。
答案 0 :(得分:5)
如果您查看EntityTypeConfiguration<TEntityType>
课程,您会看到以下签名,用于定义一对多关系(这是Team
和BirthYears
之间的关系):
HasMany<TTargetEntity>(Expression<Func<TEntityType, ICollection<TTargetEntity>>>
navigationPropertyExpression) where TTargetEntity : class;
如您所见,存在约束where TTargetEntity : class
,要求BirthYears
是class
个对象的集合。 int
不是类,因此无法进行映射。
我能看到的唯一解决方法是定义一个小班......
public class BirthYear
{
public int Id { get; set; }
public int Value { get; set; }
}
...然后在Team类的集合中使用它:
public ICollection<BirthYear> BirthYears { get; set; }
映射约定应自动创建一对多关系,这样您就不需要Fluent API来设置关联。
修改强>
根据Ladislav在评论中正确批评的更正:
类BirthYear
需要一个额外的Key属性。我添加了一个属性Id
。
此外,我猜BirthYears
将是依赖于Team
的属性。映射约定将创建从BirthYear
到Team
的可选关系。我认为通过使用Fluent API更适合模型来建立这种关系:
modelBuilder.Entity<Team>()
.HasMany(t => t.BirthYears)
.WithRequired();
这将自动启用级联删除 - 删除团队时,相关的BirthYears将从数据库中删除。
修改2
(同样基于Ladislav的评论)如果您不想在BirthYears表中复制年份,您还可以设置多对多关系:
modelBuilder.Entity<Team>()
.HasMany(t => t.BirthYears)
.WithMany();
这将在TeamBirthYears
和Team
之间添加一个连接表(BirthYear
)到数据库中。从存储空间或性能的角度来看,您可能不会赢得任何东西(因为BirthYear
类非常小并且BirthYear
表中的记录与连接表中的记录具有相同的大小) 。但是,如果您想要迟早通过其他属性扩展BirthYear
类,这可能是一种更好的方法。否则,我个人会保持简单的一对多关系。但选择权在你手中。