Использование ссылочных полей как части ключа сущности с EF 4.1 - PullRequest
0 голосов
/ 08 августа 2011

Я строю свой уровень данных с помощью Entity Framework и пытаюсь поместить ссылочные поля объекта в ключ этого объекта.

Используя VS2010, .NET 4, EF 4.1, CodeFirst.

Учитывая всю эту информацию, рассмотрим следующий пример кода:

public class Customer
{
    [Key]
    [Column(Order = 0)]
    public int SetID { get; set; }
    [Key]
    [Column(Order = 1)]
    public int CustomerId { get; set; }
    public string CustomerName { get; set; }
}

public class Product
{
    [Key]
    [Column(Order = 0)]
    public int SetID { get; set; }
    [Key]
    [Column(Order = 1)]
    public int ProductId { get; set; }
    public string ProductName { get; set; }
} 

public class SalesVolume
{
    [Key]
    [Column(Order = 0)]
    public Product product { get; set; }
    [Key]
    [Column(Order = 1)]
    public Customer customer { get; set; }
    [Key]
    [Column(Order = 2)]
    public DateTime SalesDate { get; set; }
    public double Value { get; set; }
}

Все мои данные организованы в наборы, поэтому в сущностях Product и Customer есть поля setID.

Для SalesVolume у меня есть ссылки на сущности Product и Customer, и я хочу, чтобы эти ссылочные поля были частью моего составного первичного ключа для SalesVolume.В отличие от того, что я спрашиваю, для кода выше EF сгенерировал следующую таблицу:

CREATE TABLE [dbo].[SalesVolumes](
    [SalesDate] [datetime] NOT NULL,
    [Value] [float] NOT NULL,
    [product_SetID] [int] NULL,
    [product_ProductId] [int] NULL,
    [customer_SetID] [int] NULL,
    [customer_CustomerId] [int] NULL,
PRIMARY KEY CLUSTERED 
(
    [SalesDate] ASC
)

Ссылки на товары и клиентов размещены в двух полях, и они не являются частью первичного ключа.

Как я могу сказать EF генерировать таблицу SalesVolume только с одним полем setID и с PK: (setID, productID, customerID)?

Спасибо.

1 Ответ

0 голосов
/ 19 августа 2011

На самом деле вам просто нужно объявить отношение внешнего ключа:

public class Customer
{
    [Key]
    [Column(Order = 0)]
    public int SetID { get; set; }
    [Key]
    [Column(Order = 1)]
    public int CustomerId { get; set; }
    public string CustomerName { get; set; }

    public virtual ICollection<SalesVolume> SalesVolumes {get; set;}
}

public class Product
{
    [Key]
    [Column(Order = 0)]
    public int SetID { get; set; }
    [Key]
    [Column(Order = 1)]
    public int ProductId { get; set; }
    public string ProductName { get; set; }

    public virtual ICollection<SalesVolume> SalesVolumes {get; set;}
} 

public class SalesVolume
{
    [Key]
    [Column(Order = 0)]
    public Product product { get; set; }
    [Key]
    [Column(Order = 1)]
    public Customer customer { get; set; }
    [Key]
    [Column(Order = 2)]
    public DateTime SalesDate { get; set; }
    public double Value { get; set; }
}
...