Problembehebung: Die Anzahl der Eigenschaften in den abhängigen und Hauptrollen in einer Beziehungseinschränkung muss identisch sein.

Ich verwende Entity Framework 4.3.1 für eine SQL Server 2012-Datenbank und verwende den POCO-Ansatz. Ich erhalte den folgenden Fehler und frage mich, ob jemand erklären kann, wie er behoben werden kann:

ModelValidationException

Mindestens ein Validierungsfehler wurde bei der Modellgenerierung festgestellt: \ tSystem.Data.Entity.Edm.EdmAssociationConstraint:: Die Anzahl der Eigenschaften in der abhängigen und der Hauptrolle in einer Beziehungseinschränkung muss identisch sein.

Es gibt keinInnerException für weitere Informationen zur Verfügung.

Ich kann das Datenbankschema nicht ändern und es ist ein bisschen seltsam, aber hier ist es ...

** sind der Primärschlüssel (beachten Sie, dass ich zusammengesetzte Primärschlüssel habe)(FK) Bezeichnet einen Fremdschlüssel

Hier sind die Tabellen (wenn es hilft, kann ich die SQL zum Generieren bereitstellen, aber ich glaube nicht, dass die Tabellen tatsächlich das Problem sind, da die Ausnahme in der Validierung des Modells liegt):

One
-
**OneId int not null
**TwoId int not null (FK)
**ThreeId int not null (FK)
Name nvarchar(50) not null

Two
-
**TwoId int not null
**ThreeId int not null (FK)
Name nvarchar(50) not null

Three
-
**ThreeId not null
Name nvarchar(50) not null

Hier sind die Entitäten (beachten Sie, dass ich die Fremdschlüssel in das Modell einbeziehe, aber nicht diesen hübschen Standard):

public class Three
{
    public int ThreeId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Two> Twos { get; private set; }
    public virtual ICollection<One> Ones { get; private set; }

    public void AddOne(One one)
    {
        if (one == null)
            throw new ArgumentNullException("two");

        if (Ones == null)
            Ones = new List<One>();

        if (!Ones.Contains(one))
            Ones.Add(one);

        one.Three = this;
    }

    public void AddTwo(Two two)
    {
        if (two == null)
            throw new ArgumentNullException("two");

        if (Twos == null)
            Twos = new List<Two>();

        if (!Twos.Contains(two))
            Twos.Add(two);

        two.Three = this;
    }
}

public class Two
{
    public int TwoId { get; set; }
    public int ThreeId { get; set; }
    public string Name { get; set; }
    public virtual Three Three { get; set; }
    public virtual ICollection<One> Ones { get; private set; }

    public void AddOne(One one)
    {
        if (one == null)
            throw new ArgumentNullException("two");

        if (Ones == null)
            Ones = new List<One>();

        if (!Ones.Contains(one))
            Ones.Add(one);

        one.Two = this;
    }
}

public class One
{
    public int OneId { get; set; }
    public int TwoId { get; set; }
    public int ThreeId { get; set; }
    public virtual Two Two { get; set; }
    public virtual Three Three { get; set; }
}

Und hier ist der Datenkontext:

public class DbCtx : DbContext
{
    public DbCtx(string connectionString)
        : base(connectionString)
    {
        Ones = Set<One>();
        Twos = Set<Two>();
        Threes = Set<Three>();
    }

    public DbSet<One> Ones { get; private set; }
    public DbSet<Two> Twos { get; private set; }
    public DbSet<Three> Threes { get; private set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var one = modelBuilder.Entity<One>();
        one.ToTable("One");

        one.HasKey(d => new
                            {
                                d.OneId,
                                d.TwoId,
                                d.ThreeId
                            });

        one.Property(d => d.OneId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        one.HasRequired(t => t.Two)
            .WithMany(s => s.Ones)
            .HasForeignKey(t => t.TwoId);

        one.HasRequired(t => t.Three)
            .WithMany(s => s.Ones)
            .HasForeignKey(t => t.ThreeId);

        var two = modelBuilder.Entity<Two>();
        two.ToTable("Two");

        two.HasKey(d => new
                            {
                                d.TwoId,
                                d.ThreeId
                            });

        two.Property(p => p.TwoId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        two.HasRequired(t => t.Three)
            .WithMany(s => s.Twos)
            .HasForeignKey(t => t.ThreeId);

        var three = modelBuilder.Entity<Three>();
        three.ToTable("Three");
        three.HasKey(s => s.ThreeId);

        three.Property(p => p.ThreeId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        base.OnModelCreating(modelBuilder);
    }
}

Schließlich ist dies ein Codeausschnitt, der die Ausnahme verursacht:

using (var ctx = new DbCtx(@"....."))
{
    Console.WriteLine(ctx.Twos.Count());
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage