índice válido usarse una tipo tabla secundaria que primaria para modelo llave incluir hacer foranea externa crear compuesta como columnas columna clave agregar c# entity-framework code-first

c# - válido - Influencia de la designación de columna de clave externa en el código EF primero(CTP5)



llave secundaria sql (1)

EF Code First utiliza, de forma predeterminada, la convención sobre la configuración. Sin embargo, puede establecer alternativas explícitas anulando DbContent.OnModelCreating. Muchos ejemplos aquí , cortesía de ScottGu.

EDITAR

Entonces en CTP5, MapSingleType desapareció como se describe aquí . Lo siguiente funciona para propiedades simples de cadenas, pero no para las relaciones de organización a persona. Tengo curiosidad y tengo planes de seguir mirándolo, pero mientras tanto, quizás esto lo haga comenzar o alguien más pueda completar la respuesta.

public class Person : Customer { [Column(Name="EmailAddress")] public string Email { get; set; } }

EDIT 2

Ok, esto lo entiende. Encontré la respuesta aquí . Descargo de responsabilidad: solo he verificado que el esquema de la base de datos se crea como se esperaba. No he probado que los datos de siembra o las operaciones CRUD adicionales funcionen como se esperaba.

public class Organisation : Customer { [Column(Name = "FinancialContact")] public int? FinancialContactId { get; set; } [ForeignKey("FinancialContactId")] public Person FinancialContact { get; set; } [Column(Name = "MainContact")] public int? MainContactId { get; set; } [ForeignKey("MainContactId")] public Person MainContact { get; set; } }

Tengo una clase POCO que tiene dos relaciones unarias de una vía con otra clase, ambas comparten un ancestro. Los nombres de las claves externas en el esquema generado no reflejan los nombres de las propiedades. (Las propiedades MainContact y FinancialContact dan nombres de campo PersonId y PersonId1).

¿Cómo puedo influir en la generación de esquemas para generar nombres de columnas de bases de datos que coincidan con los nombres de las propiedades?

El modelo se ve así:

El código se ve así:

public class CustomerContext: DbContext { public DbSet<Organisation> Organisations { get; set; } public DbSet<Person> Persons { get; set; } protected override void OnModelCreating(ModelBuilder builder) { DbDatabase.SetInitializer(new DropCreateDatabaseAlways<CustomerContext>()); } } public abstract class Customer { public int Id { get; set; } public string Name { get; set; } } public class Person : Customer { public string Email { get; set; } } public class Organisation : Customer { public Person FinancialContact { get; set; } public Person MainContact { get; set; } }

El esquema se ve así:

Respuesta de druttka

La respuesta de druttka a continuación hizo el trabajo y es bueno saber que es un error de CTP5 lo que está detrás de esto. EF también necesita que se especifique el comportamiento en cascada y he usado la API con fluidez para hacer esto siguiendo el ejemplo en el enlace dado por druttka. Un poco más de buena lectura de Morteza Manavi aquí .

El código ahora es esto:

public class CustomerContext : DbContext { public DbSet<Organisation> Organisations { get; set; } public DbSet<Person> Persons { get; set; } protected override void OnModelCreating(ModelBuilder builder) { DbDatabase.SetInitializer(new DropCreateDatabaseAlways<CustomerContext>()); builder.Entity<Organisation>() .HasRequired(p => p.MainContact) .WithMany() .HasForeignKey(p => p.MainContactId) .WillCascadeOnDelete(false); builder.Entity<Organisation>() .Property(p => p.MainContactId) .HasColumnName("MainContact"); builder.Entity<Organisation>() .HasRequired(p => p.FinancialContact) .WithMany() .HasForeignKey(p => p.FinancialContactId) .WillCascadeOnDelete(false); builder.Entity<Organisation>() .Property(p => p.FinancialContactId) .HasColumnName("FinancialContact"); } } public abstract class Customer { public int Id { get; set; } public string Name { get; set; } } public class Person : Customer { public string Email { get; set; } } public class Organisation : Customer { public Person FinancialContact { get; set; } public int FinancialContactId { get; set; } public Person MainContact { get; set; } public int MainContactId { get; set; } }

Que ahora da la base de datos mucho más adecuada: