Du er måske et offer for EF Code-First-kortlægningskonventionerne, som automatisk skaber et forhold mellem NationAllies
og toNation
du ikke vil have.
Hvis jeg forstår dig rigtigt (men jeg er ikke 100 procent sikker, hvis jeg gør det), vil du faktisk gerne have to forhold, og du har kun afsløret den ene ende af forholdet i hver af entiteterne. Altså NationAllies
peger IKKE på toNation
men til en "usynlig" ejernation i din NationAlly
enhed.
Hvis det er tilfældet, skal du eksplicit overskrive konventionstilknytningerne. I Fluent API af EF 4.1 kunne dette se ud som:
public class MyContext : DbContext
{
public DbSet<Nation> Nations { get; set; }
public DbSet<NationAlly> NationAllies { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Nation>()
.HasMany(n => n.NationAllies)
.WithRequired()
.Map(conf => conf.MapKey("OwnerID"))
.WillCascadeOnDelete(false);
modelBuilder.Entity<NationAlly>()
.HasRequired(a => a.toNation)
.WithMany()
.Map(conf => conf.MapKey("NationID"))
.WillCascadeOnDelete(false);
}
}
Denne tilknytning ville skabe de to fremmednøgler OwnerID
og NationID
i NationAllies
tabel, der begge peger på den primære nøgle ID
i Nations
tabel.
Rediger
Her er den applikation, jeg har testet med:
- Opret en ny konsolapp i VS2010 / .NET 4.0, giv den navnet "NationsApp"
- Tilføj en reference til "EntityFramework.dll"
- Ryd indholdet af "Program.cs", og indsæt i stedet følgende i:
Indhold af Program.cs:
using System;
using System.Collections.Generic;
using System.Data.Entity;
namespace NationsApp
{
public class Nation
{
public int ID { get; set; }
public int name { get; set; }
public List<NationAlly> NationAllies { get; set; }
}
public class NationAlly
{
public int ID { get; set; }
public int level { get; set; }
public Nation toNation { get; set; }
}
public class NationsContext : DbContext
{
public DbSet<Nation> Nations { get; set; }
public DbSet<NationAlly> NationAllies { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Nation>()
.HasMany(n => n.NationAllies)
.WithRequired()
.Map(conf => conf.MapKey("OwnerID"))
.WillCascadeOnDelete(false);
modelBuilder.Entity<NationAlly>()
.HasRequired(a => a.toNation)
.WithMany()
.Map(conf => conf.MapKey("NationID"))
.WillCascadeOnDelete(false);
}
}
class Program
{
static void Main(string[] args)
{
using (var context = new NationsContext())
{
try
{
// We have three Nations and two Allies
Nation nation1 = new Nation() {
NationAllies = new List<NationAlly>() };
Nation nation2 = new Nation() {
NationAllies = new List<NationAlly>() };
Nation nation3 = new Nation() {
NationAllies = new List<NationAlly>() };
NationAlly ally1 = new NationAlly();
NationAlly ally2 = new NationAlly();
// Nation1 has two Allies
// (Nation1 is the "owner" of both Allies)
nation1.NationAllies.Add(ally1);
nation1.NationAllies.Add(ally2);
// toNation of ally1 refers to Nation2
ally1.toNation = nation2;
// toNation of ally2 refers to Nation3
ally2.toNation = nation3;
context.Nations.Add(nation1);
context.Nations.Add(nation2);
context.Nations.Add(nation3);
context.SaveChanges();
}
catch (Exception e)
{
throw;
}
}
}
}
}
Du kan indstille et brudpunkt på "kast" for at se mulige undtagelser i e i debuggeren.
Dette opretter en database kaldet NationsApp.NationsContext
hvis du bruger SQL Server Express og ikke har defineret yderligere forbindelsesstrenge.
Det giver to relationer Nation_NationAllies
(FK er "OwnerID") og NationAlly_toNation
(FK er "NationID"). Alle kolonner kan ikke nulstilles. Resultatet i DB er følgende: