Domanda

Ho una domanda veloce su come configurare le mappature tra [Order Details], [Products] e [Orders] nel datbase Northwind.

[Order Details] non ha alcuna chiave primaria, e si presenta come questo

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

Quindi la mia domanda è: come faccio (e posso) impostare la mia classe OrderDetails di lavoro come questo?

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

I miei sguardi contestuali dati come questo

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

}

E mio OrderDetailsConfiguration (vuoto perchè non so quello che sto facendo)

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

Eventuali suggerimenti o idee sarebbero grandi.

È stato utile?

Soluzione

Per prima cosa avrebbe dovuto mettere esplicitamente in PK e FKS all'interno OrderDetails classe:

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

Poi, con il seguente codice è possibile specificare le PK per OrderDetailsConfiguration classe:
(Si prega di notare che in Northwind di database sia IDOrdine e ProductID sono PKs per OrderDetails tabella).

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

E inoltre si può usare RecreateDatabaseIfModelChanges strategia per forzare il database per ricreare ogni volta che si cambia il modello di classe:

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

Il punto interessante è che una volta che hai fatto questi cambiamenti EF dedurre automaticamente i FKS da OrderDetails di classe e creare le relazioni con Ordini e Prodotti tavolo su OrderID e ProductID in base alla Convenzioni per Codice primo:

  

Codice primo sarà dedurre che qualsiasi proprietà denominata <navigation property name><primary key property name> (cioè ProductsProductID), <principal class name><primary key property name> (vale a dire ProductProductID) o <primary key property name> (vale a dire ProductID), con lo stesso tipo di dati come chiave primaria, rappresenta una chiave esterna per la relazione. Se vengono trovate più corrispondenze quindi la precedenza viene data nell'ordine di cui sopra. rilevamento chiave esterna non sarà maiuscole e minuscole.

Altri suggerimenti

campi chiave Segna con l'attributo [Key]. Avrete bisogno di aggiungere [Colonna (Order = x)] in caso di chiavi composte, x = 0, 1, 2, ... Numerazione può iniziare da qualsiasi numero https://msdn.microsoft.com/en-us/data/jj591583.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top