使用多个表在实体框架4.1中设置代码优先关联

时间:2011-10-22 21:31:06

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

对不起,如果这是一件简单的事情,但我只是学习EF,似乎无法找到我的答案(或者它可能只是理解我所发现的)。

我有三个现有的数据库表如下:

Order:
   int OrderNo (Primary Key generated by program)
   ...

OrderDetails:
   int OrderNo (Foreign key from Order=>OrderNo; but part of primary key for OrderDetails)
   int DetailNo (Part of primary key; generated by program)
   ...

OrderResults:
   int OrderNo (Key from Detail=>OrderNo; but part of primary key for OrderResults)
   int DetailNo (Key from Detail=>DetailNo; but part of primary key fro OrderResult)
   int ResultNo (Part of primary key; generated by program)
   ...

我的实体定义为:

public Class Order
{
   public int OrderNo { get; set; }

   publice virtual ICollection<Detail> Details { get; set; }
}

public Class Detail
{
   public int OrderNo { get; set; }
   public int DetailNo { get; set; }

   public virtual Order Order { get; set; }
   public virtual ICollection<Result> Results { get; set; }
}

public Class Result
{
   public int OrderNo { get; set; }
   public int DetailNo { get; set; }
   public int ResultNo { get; set; }

   public virtual Detail Detail { get; set; }
}

那么如何使用流畅的API定义这些键和关联?目前我正在正确地将OrderDetails链接到订单,但没有获得正确的OrderResults。

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Mapping for Order
    modelBuilder.Entity<Order>()
        .HasKey(o => o.OrderNo);

    modelBuilder.Entity<Order>()
        .Property(o => o.OrderNo)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

    modelBuilder.Entity<Order>()
        .HasMany(o => o.Details)
        .WithRequired(d => d.Order)
        .HasForeignKey(d => d.OrderNo);

    // Mapping for Detail
    modelBuilder.Entity<Detail>()
        .HasKey(d => new { d.OrderNo, d.DetailNo });
    // I believe, setting to DatabaseGeneratedOption.None is not necessary
    // for composite keys

    modelBuilder.Entity<Detail>()
        .HasMany(d => d.Results)
        .WithRequired(r => r.Detail)
        .HasForeignKey(r => new { r.OrderNo, r.DetailNo });

    // Mapping for Result
    modelBuilder.Entity<Result>()
        .HasKey(r => new { r.OrderNo, r.DetailNo, r.ResultNo });
}

在这个例子中,Fluent API非常详细。您可以使用数据注释定义所有映射。