Entity Framework 4.1 Atributo InverseProperty


Solo quería saber más sobre el atributo RelatedTo y descubrí que ha sido reemplazado por los atributos ForeignKey y InverseProperty en EF 4.1 RC.

¿Alguien conoce algún recurso útil sobre los escenarios en los que este atributo se vuelve útil?

¿ Debo usar este atributo en las propiedades de navegación? ejemplo:

public class Book
{
  public int ID {get; set;}
  public string Title {get; set;}

  [ForeignKey("FK_AuthorID")]
  public Author Author {get; set;}
}  

public class Author
{
  public int ID {get; set;}
  public string Name {get; set;}
  // Should I use InverseProperty on the following property?
  public virtual ICollection<Book> Books {get; set;}
}
Author: Jacob, 2011-04-19

2 answers

Añado un ejemplo para el InversePropertyAttribute. No solo se puede usar para relaciones en entidades auto referenciadas (como en el ejemplo vinculado en la respuesta de Ladislav), sino también en el caso "normal" de relaciones entre diferentes entidades:

public class Book
{
    public int ID {get; set;}
    public string Title {get; set;}

    [InverseProperty("Books")]
    public Author Author {get; set;}
}

public class Author
{
    public int ID {get; set;}
    public string Name {get; set;}

    [InverseProperty("Author")]
    public virtual ICollection<Book> Books {get; set;}
}

Esto describiría la misma relación que este Código Fluido:

modelBuilder.Entity<Book>()
            .HasOptional(b => b.Author)
            .WithMany(a => a.Books);

... o ...

modelBuilder.Entity<Author>()
            .HasMany(a => a.Books)
            .WithOptional(b => b.Author);

Ahora, agregar el atributo InverseProperty en el ejemplo anterior es redundante: Las convenciones de asignación crearían el mismo único relación de todos modos.

Pero considere este ejemplo (de una biblioteca de libros que solo contiene libros escritos juntos por dos autores):

public class Book
{
    public int ID {get; set;}
    public string Title {get; set;}

    public Author FirstAuthor {get; set;}
    public Author SecondAuthor {get; set;}
}

public class Author
{
    public int ID {get; set;}
    public string Name {get; set;}

    public virtual ICollection<Book> BooksAsFirstAuthor {get; set;}
    public virtual ICollection<Book> BooksAsSecondAuthor {get; set;}
}

Las convenciones de asignación no detectarían qué extremos de estas relaciones pertenecen juntos y en realidad crearían cuatro relaciones (con cuatro claves foráneas en la tabla Books). En esta situación usar el InverseProperty ayudaría a definir las relaciones correctas que queremos en nuestro modelo:

public class Book
{
    public int ID {get; set;}
    public string Title {get; set;}

    [InverseProperty("BooksAsFirstAuthor")]
    public Author FirstAuthor {get; set;}
    [InverseProperty("BooksAsSecondAuthor")]
    public Author SecondAuthor {get; set;}
}

public class Author
{
    public int ID {get; set;}
    public string Name {get; set;}

    [InverseProperty("FirstAuthor")]
    public virtual ICollection<Book> BooksAsFirstAuthor {get; set;}
    [InverseProperty("SecondAuthor")]
    public virtual ICollection<Book> BooksAsSecondAuthor {get; set;}
}

Aquí solo obtendríamos dos relaciones. (Nota: El atributo InverseProperty solo es necesario en un extremo de la relación, podemos omitir el atributo en el otro extremo.)

 80
Author: Slauma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-19 13:39:18

ForeignKey el atributo empareja la propiedad FK con la propiedad navigation. Se puede colocar en la propiedad FK o en la propiedad navigation. Es equivalente a HasForeignKey fluent mapping.

public class MyEntity
{
    public int Id { get; set; }

    [ForeignKey("Navigation")]
    public virtual int NavigationFK { get; set; }

    public virtual OtherEntity Navigation { get; set; }
}

InverseProperty se utiliza para definir la relación de autoreferenciación y las propiedades de navegación de emparejamiento en ambos extremos. Compruebe esta pregunta para la muestra.

 28
Author: Ladislav Mrnka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:52