3

我有一个关于在 Northwind 数据库中设置和之间[Order Details]的映射的快速问题。[Products][Orders]

[Order Details]没有主键,看起来像这样

[Order Details]
OrderId (int)
ProductId (int)
...

所以我的问题是我如何(并且我可以)设置我的OrderDetails班级以这样的方式工作?

public class OrderDetails
{
    public virtual Order Order { get; set; }
    public virtual Product Product { get; set; }
    public Decimal UnitPrice { get; set; }
    public int Quantity { get; set; }
    public Decimal Discount { get; set; }
}

我的数据上下文看起来像这样

public class NorthwindDb : DbContext
{
    public DbSet<Product> Products { get; set; }
    public DbSet<Category> Categories { get; set; }
    public DbSet<Order> Orders { get; set; }
    public DbSet<OrderDetails> OrderDetails { get; set; }
    public DbSet<Customer> Customers { get; set; }


    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new OrderDetailsConfiguration());
    }

    public static void InitializeBecauseOfThatWeirdMetaDataThingThatIDontUnderstandYet()
    {
        Database.SetInitializer<NorthwindDb>(null);
    }

}

还有我的OrderDetailsConfiguration(空的,因为我不知道我在做什么)

public class OrderDetailsConfiguration : EntityConfiguration<OrderDetails>
{
    public OrderDetailsConfiguration()
    {
        //HasKey(x => x.Order.OrderId);
        //HasKey(x => x.Product.ProductId);
    }
}

任何提示或想法都会很棒。

4

2 回答 2

4

首先,您必须在OrderDetails类中明确放入 PK 和 FK :

public class OrderDetails 
{        
    public int OrderID { get; set; }
    public int ProductID { get; set; }

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

    public Decimal UnitPrice { get; set; }
    public int Quantity { get; set; }
    public Decimal Discount { get; set; }
}

然后使用以下代码,您可以为OrderDetailsConfiguration类指定 PK:(
请注意,在Northwind数据库中,OrderIDProductID都是OrderDetails表的 PK)。

public class OrderDetailsConfiguration : EntityConfiguration<OrderDetails> 
{
    public OrderDetailsConfiguration() 
    {
        HasKey(od => new 
        {
            od.ProductID,
            od.OrderID
        });
    }
}

您还可以使用RecreateDatabaseIfModelChanges策略来强制每次更改类模型时重新创建数据库:

Database.SetInitializer<NorthwindDb>(
        new RecreateDatabaseIfModelChanges<NorthwindDb>());

有趣的一点是,一旦您进行了这些更改,EF 将自动从OrderDetails类推断 FK,并根据Code First的约定在 OrderID 和 ProductID 上创建与OrdersProducts表的关系:

Code First 将推断任何名为<navigation property name><primary key property name>(即ProductsProductID)、<principal class name><primary key property name>(即ProductProductID)或<primary key property name>(即ProductID)的属性,具有与主键相同的数据类型,表示关系的外键。如果找到多个匹配项,则按上面列出的顺序给出优先级。外键检测将不区分大小写。

于 2010-11-11T20:53:20.770 回答
1

用 [Key] 属性标记关键字段。如果是复合键,则需要添加 [Column(Order = x)],x = 0, 1, 2, ... 编号可以从任何数字开始 https://msdn.microsoft.com/en-us/数据/jj591583.aspx

于 2015-06-22T15:00:27.243 回答