复合键作为外键

时间:2011-03-25 18:41:51

标签: c# entity-framework ef-code-first foreign-keys composite-key

我在MVC 3应用程序中使用Entity framework 4.1。我有一个实体,我有主键由两列(复合键)组成。并且这在另一个实体中用作外键。如何建立关系?在正常的scnerios我们使用:

public class Category
{
    public string CategoryId { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public string CategoryId { get; set; }

    public virtual Category Category { get; set; }
} 

但是如果类别有两列密钥怎么办?

2 个答案:

答案 0 :(得分:137)

您可以使用任何一种流畅的API:

public class Category
{
    public int CategoryId1 { get; set; }
    public int CategoryId2 { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public int CategoryId1 { get; set; }
    public int CategoryId2 { get; set; }

    public virtual Category Category { get; set; }
}

public class Context : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Category>()
            .HasKey(c => new {c.CategoryId1, c.CategoryId2});

        modelBuilder.Entity<Product>()
            .HasRequired(p => p.Category)
            .WithMany(c => c.Products)
            .HasForeignKey(p => new {p.CategoryId1, p.CategoryId2});

    }
}

或数据注释:

public class Category
{
    [Key, Column(Order = 0)]
    public int CategoryId2 { get; set; }
    [Key, Column(Order = 1)]
    public int CategoryId3 { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    [Key]
    public int ProductId { get; set; }
    public string Name { get; set; }
    [ForeignKey("Category"), Column(Order = 0)]
    public int CategoryId2 { get; set; }
    [ForeignKey("Category"), Column(Order = 1)]
    public int CategoryId3 { get; set; }

    public virtual Category Category { get; set; }
}

答案 1 :(得分:16)

我认为最简单的方法是在Navigation属性上使用Data Annotation,如下所示:         @foreach($days_off as $day_off) <tr> <td>{{ $day_off->off_type }}</td> <td>{{ $start = $day_off->off_from }}</td> <td>{{ $end = $day_off->off_to }}</td> <td> {{$end->diffInDays(start)}} days off </td> </tr> @endforeach

[ForeignKey("CategoryId1, CategoryId2")]