独特的索引,流畅的api

时间:2013-05-18 19:37:49

标签: ef-code-first entity-framework-5 entity-relationship

我有一个表Person,Order和PersonOrder。

在表PersonOrder中,我有一个PersonId和OrderId列。 如何在这些列之间使用unique index创建Fluent API

这是我的尝试:

modelBuilder.Entity<PersonOrder>()
            .HasKey(l => new { l.PersonId , l.OrderId});


[Table("PersonOrder")]
public class PersonOrder
{
    public int PersonId { get; set; }
    public int OrderId{ get; set; }

    public virtual Person Person { get; set; }
    public virtual Order Order { get; set; }
}

2 个答案:

答案 0 :(得分:1)

这有什么问题? - 这是多对多composite index的方式......

我将发布完整的示例,通常对所有列(以及您可能已经拥有的典型导航属性)进行多次或多次映射(

modelBuilder.Entity<PersonOrder>()
    .HasKey(x => new { x.PersonId, x.OrderId }); 

modelBuilder.Entity<PersonOrder>()
    .HasRequired(x => x.Person)
    .WithMany(x => x.PersonOrders)
    .HasForeignKey(x => x.PersonId)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<PersonOrder>()
    .HasRequired(x => x.Order)
    .WithMany(x => x.PersonOrders)
    .HasForeignKey(x => x.OrderId)
    .WillCascadeOnDelete(false);

答案 1 :(得分:1)

我不得不考虑一段时间来获得你可能的含义。我认为您的意思是PersonOrder.PersonIdPersonOrder.OrderId上存在非唯一索引。

是主键PersonOrder.PersonId + PersonOrder.OrderId上的唯一索引。这是唯一应该是唯一的东西。各个字段的索引永远不会是唯一的。这意味着该协会实际上并不是多对多,而是一对多。

或者你所追求的是:拥有1(人)到多(订单)协会? (使用唯一的PersonOrder.OrderId)。在这种情况下,您也可以将关联建模为常规的1到多个:Person.OrdersOrder.Person(单数)。