Настройка первых ассоциаций кода в объектном фрейме 4.1 с несколькими таблицами - PullRequest
1 голос
/ 23 октября 2011

Извините, если это простая вещь, но я просто изучаю 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, связанные с Order правильно, но не получаю правильные OrderResults.

1 Ответ

0 голосов
/ 23 октября 2011

Вы можете попробовать что-то вроде этого:

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 в этом примере довольно многословен.Все сопоставления также можно определить с помощью аннотаций данных.

...