Vedi http://msdn.microsoft.com/en-us/data/jj591620 EF relazioni
un libro eccellente http://my.safaribooksonline.com/book/-/9781449317867
Ecco un post dal sviluppatore da dicembre 2010. Ma ancora rilevante http://social.msdn.microsoft.com/Forums/uk/adonetefx/thread/aed3b3f5-c150-4131-a686-1bf547a68804 L'articolo di cui sopra è un bel riassunto o le combinazioni possibili qui.
Una soluzione in cui la tabella dipendente ha una chiave dalla tabella primaria è possibile.
Se si desiderano chiavi indipendenti in cui entrambi sono principali in uno scenario PK/FK, non penso che si possa farlo in codice prima con Fluent API. Se condividono una chiave, sei OK. 1: 1 opzionale presuppone che il dipendente utilizzi la chiave da Principale.
Ma poiché è necessario salvare uno dei tavoli prima dell'altro. È possibile selezionare una delle chiavi esterne con il codice. O aggiungi il secondo Foreign to Database dopo che Code lo ha creato per primo.
Ti avvicinerai. Ma EF si lamenterà delle chiavi esterne in conflitto se vuoi che siano entrambe chiavi esterne. Essenzialmente A dipende da B dipende A EF non piace, anche se le colonne sono annullabili e tecnicamente possibili sul DB.
Qui utilizzare questo programma di prova per provarlo. Basta commentare le novità di Fluent API per provare alcune opzioni. Non ho potuto ottenere EF5.0 per lavorare con INDKENDENT PK/FK 0: 1 a 0: 1 Ma ovviamente ci sono dei compromessi ragionevoli come discusso.
using System.Data.Entity;
using System.Linq;
namespace EF_DEMO
{
class Program
{
static void Main(string[] args) {
var ctx = new DemoContext();
var ord = ctx.Orders.FirstOrDefault();
//. DB should be there now...
}
}
public class Order
{
public int Id {get;set;}
public string Code {get;set;}
public int? QuotationId { get; set; } //optional since it is nullable
public virtual Quotation Quotation { get; set; }
//....
}
public class Quotation
{
public int Id {get;set;}
public string Code{get;set;}
// public int? OrderId { get; set; } //optional since it is nullable
public virtual Order Order { get; set; }
//...
}
public class DemoContext : DbContext
{
static DemoContext()
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DemoContext>());
}
public DemoContext()
: base("Name=Demo") { }
public DbSet<Order> Orders { get; set; }
public DbSet<Quotation> Quotations { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>().HasKey(t => t.Id)
.HasOptional(t => t.Quotation)
.WithOptionalPrincipal(d => d.Order)
.Map(t => t.MapKey("OrderId")); // declaring here via MAP means NOT declared in POCO
modelBuilder.Entity<Quotation>().HasKey(t => t.Id)
.HasOptional(q => q.Order)
// .WithOptionalPrincipal(p => p.Quotation) //as both Principals
// .WithOptionalDependent(p => p.Quotation) // as the dependent
// .Map(t => t.MapKey("QuotationId")); done in POCO.
;
}
}
}
fonte
2013-02-05 13:43:11
'Quotazione pubblica Quotazione virtuale {get; impostato; } ', no? Perché non stai usando le proprietà? Perché tutti i tuoi campi sono privati? –
scusate, ho modificato il mio codice per le proprietà. le mie lezioni non sono virtuali – Masoud
non è una classe virtuale, è una proprietà di navigazione virale, nella classe Ordine. –