sql >> Database teknologi >  >> RDS >> Sqlserver

Multiplikitetsbegrænsning overtrådte SQL Server 2008 - CodeFirst

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:



  1. Data fra databasen vises ikke i tabellen på HTML-webstedet

  2. Sådan rettes InterfaceError:2003:Kan ikke oprette forbindelse til MySQL-serveren på '127.0.0.1:3306:3306' (11001 getaddriinfo mislykkedes)

  3. 5 måder at få det korte månedsnavn fra en dato i SQL Server

  4. Høj pladsforbrug Fra crfclust.bdb