对不起,如果这是一件简单的事情,但我只是学习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。
答案 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非常详细。您可以使用数据注释定义所有映射。