2011-10-22 48 views
1

对不起,如果这是一件简单的事情,但我只是学习EF,似乎无法找到我的答案(或者它只是明白我在找什么)。在实体框架4.1中设置代码优先关联与多个表格

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

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。

+0

下次要更加小心标签选择。我相信围绕你的问题长久的沉默是由于一堆过于普遍和“异国情调”的标签。我已经用EF专用标签代替了它们。 – Slauma

回答

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 }); 
} 

流利的API在这个例子中相当冗长。您可以使用数据注释来定义所有映射。

+0

非常感谢,他们做了这个诀窍,并花了很长时间了解关联设置。我会尽量在我的标签上更加小心。 – dhamilton

相关问题