代码之家  ›  专栏  ›  技术社区  ›  Joe

如何先在实体框架代码中指定复合键

  •  3
  • Joe  · 技术社区  · 15 年前

    我有一个关于在 [Order Details] , [Products] [Orders] 在北风基地。

    [订单详情] 没有主键,如下所示

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

    任何暗示或想法都很好。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Dylan Beattie    11 年前

    首先你必须明确地把PKs和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; }
    }
    

    然后使用以下代码可以指定 订单详细信息配置 班级:
    (请注意 罗斯文 两个数据库 订单编号 产品ID PKs是 订单详细信息 表)。

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

    你也可以用 重新创建DatabaseIfModelChanges 每次更改类模型时强制重新创建数据库的策略:

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

    有趣的一点是,一旦你做了这些改变,EF将自动推断FKs 订单详细信息 类并创建与 命令 产品 基于 Conventions for Code First:

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

        2
  •  1
  •   user1920925    11 年前

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