Unable to determine the principle end of an association

后端 未结 2 958
耶瑟儿~
耶瑟儿~ 2021-01-25 10:59

Using EF5 Code first, I have two classes:

[Table(\"UserProfile\")]
public class UserProfile {

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)         


        
相关标签:
2条回答
  • 2021-01-25 11:40

    The trick with 1:1 in EF is the dependant table MUST have the same primary key. The Primary tables has the DB generated ID. The dependant uses DatabaseGeneratedOption.None !

    so the fluentAPI for the dependant table

     {
      // map for Dependant
      // Relationship
            this.HasKey(t => t.Id);
            // Properties
            //Id is an int allocated by DB but controller via Primary here
            this.Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); // from parent
            entity.HasRequired(t => t.NAV_PROP_TO_PRIMARY)
                  .WithOptional(t => t.NAV_PROP_DEPENDANT) // if it is declared. NOT required.
                  .WillCascadeOnDelete(true);   // as appropriate
     }   
    
     {
         //map for Primary
         // Primary Key
         this.HasKey(t => t.Id);
    
         // Properties
         //Id is an int allocated by DB
        this.Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); // default to db generated
    
     }
    
    
    public class Dependant{ 
       public  virtual int Id { set; get; }
       //... other props
       public virtual Primary Primary {get; set;}   // nav to primary
    } 
    
    public class Primary{ 
       public  virtual int Id { set; get; }
    
    } 
    
    0 讨论(0)
  • 2021-01-25 11:45

    You define the principal when you map:

    modelBuilder.Entity<Bar>()
                .HasOptional(f => f.Baz). //Baz is dependent and gets a FK BarId
                .WithRequired(s => s.Bar);//Bar is principal
    
    modelBuilder.Entity<Baz>()
                .HasOptional(f => f.Bar). //Bar is dependent and gets a FK BazId
                .WithRequired(s => s.Baz);//Baz is principal
    

    The dependent gets the foreign key that references the principal's key. When it's a one to one, that foreign key is also the dependent's primary key but EF can't work out which is which and that's why you get an error until you've specified it.

    References:

    http://msdn.microsoft.com/en-us/library/ee382827.aspx

    https://stackoverflow.com/a/19580798/150342

    0 讨论(0)
提交回复
热议问题