我有一个关于在之间建立映射的快速问题 [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);
    }
}

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

有帮助吗?

解决方案

首先,您必须明确放入PK和FKS内部 订单详细信息 班级:

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

然后,使用以下代码,您可以指定PK OrderDetailsconfiguration 班级:
(请注意 北风 数据库两者 Orderidproductid 是PK 订单详细信息 桌子)。

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

而且您也可以使用 retreateTatabaseifModelchanges 每当您更改类模型时,都会迫使您的数据库重新创建数据库:

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

有趣的一点是,一旦您做出了这些更改,EF将自动从 订单详细信息 阶级并建立关系 订单产品 基于Ordorid和Productid的表 代码的约定:

代码首先将推断出任何名称的属性 <navigation property name><primary key property name> (IE ProductsproductId), <principal class name><primary key property name> (IE ProductProductId)或 <primary key property name> (IE ProductID),具有与主键相同的数据类型,代表了关系的外键。如果找到多个匹配项,则在上面列出的顺序中给出了优先级。外键检测不会对情况敏感。

其他提示

用[键]属性标记键字段。如果复合键,x = 0、1、2,...编号可以从任何数字开始https://msdn.microsoft.com/en-us/data/jj591583.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top