如何使用EF CTP5 </int>保存ICollection <int>

时间:2011-04-06 12:37:36

标签: entity-framework ef-code-first entity-framework-4.1

我的班级有这个属性:团队

[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值。

我错过了什么,我想我需要在我的存储库类中做一些O​​nModelCreating方法。

1 个答案:

答案 0 :(得分:5)

如果您查看EntityTypeConfiguration<TEntityType>课程,您会看到以下签名,用于定义一对多关系(这是TeamBirthYears之间的关系):

HasMany<TTargetEntity>(Expression<Func<TEntityType, ICollection<TTargetEntity>>>
   navigationPropertyExpression) where TTargetEntity : class;

如您所见,存在约束where TTargetEntity : class,要求BirthYearsclass个对象的集合。 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的属性。映射约定将创建从BirthYearTeam的可选关系。我认为通过使用Fluent API更适合模型来建立这种关系:

modelBuilder.Entity<Team>()
            .HasMany(t => t.BirthYears)
            .WithRequired();

这将自动启用级联删除 - 删除团队时,相关的BirthYears将从数据库中删除。

修改2

(同样基于Ladislav的评论)如果您不想在BirthYears表中复制年份,您还可以设置多对多关系:

modelBuilder.Entity<Team>()
            .HasMany(t => t.BirthYears)
            .WithMany();

这将在TeamBirthYearsTeam之间添加一个连接表(BirthYear)到数据库中。从存储空间或性能的角度来看,您可能不会赢得任何东西(因为BirthYear类非常小并且BirthYear表中的记录与连接表中的记录具有相同的大小) 。但是,如果您想要迟早通过其他属性扩展BirthYear类,这可能是一种更好的方法。否则,我个人会保持简单的一对多关系。但选择权在你手中。