当值是列表时实体拆分

时间:2013-09-10 22:22:56

标签: c# entity-framework

我有3个表存储我的MVC3程序的数据(我制作了样本表来说明)。

enter image description here

我正在使用实体框架,但不知道如何连接这些表,所以我会得到这样的东西:

    public class TableABC
{ 
    public int Id { get; set; }

    public string Name { get; set; }

    public string Surname { get; set; }

    public List<string> Colours { get; set; }

    public List<string> Pets { get; set; }
}

我发现这被称为“实体分裂”,我需要映射这些表,但完全不知道如何开始。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您无法将基本类型映射到表,因此您应该使用另一个实体而不是字符串列表:

public class TableABC
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public virtual List<Colour> Colours { get; set; }
    public virtual List<Pet> Pets { get; set; }
}

public class Colour
{
    public int Id { get; set; }
    public string Value { get; set; }
}

public class Pet
{
    public int Id { get; set; }
    public string Name { get; set; }
}

这里是映射(覆盖自定义DbContext的OnModelCreating方法以提供映射):

modelBuilder.Entity<TableABC>().Property(t => t.Name).HasColumnName("name");
modelBuilder.Entity<TableABC>().Property(t=>t.Surname).HasColumnName("surname");
modelBuilder.Entity<TableABC>()
    .HasMany(t => t.Colours).WithRequired().HasForeignKey(c => c.Id);
modelBuilder.Entity<TableABC>()
    .HasMany(t => t.Pets).WithRequired().HasForeignKey(p => p.Id);

modelBuilder.Entity<Colour>().Property(c => c.Value).HasColumnName("colours");
modelBuilder.Entity<Colour>().HasKey(c => new { c.Id, c.Value });
modelBuilder.Entity<Pet>().Property(p => p.Name).HasColumnName("pets");
modelBuilder.Entity<Pet>().HasKey(c => new { c.Id, c.Name });

请记住,我使用复合键作为颜色和宠物,它应该对所有记录都是唯一的。