Estoy usando un enfoque de código primero con Entity Framework Core y Fluent API y estoy tratando de crear una columna para una tabla que tiene un valor generado basado en otras columnas de esta tabla. Esta tabla también contiene claves externas, que me gustaría representar de manera diferente a su Id (por ejemplo, una columna llamada nombre).
Este es el código genérico de mi situación actualmente.
public class Book { public int Id { get; set; } public string Title { get; set; } public int AuthorId { get; set; } public Author Author { get; set; } public string Display { get; set; } } public class Author { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public virtual ICollection<Book> Books { get; set; } } Y OnModelCreating en mi DbContext se ve así:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // BOOK Definition modelBuilder.Entity<Book>(entity => { // Primary key entity.HasKey(p => p.Id); // Foreign key entity.HasOne(v => v.Author) .WithMany(v => v.Books) .HasForeignKey(v => v.AuthorId); // Properties entity.Property(p => p.Id).ValueGeneratedOnAdd(); entity.Properties(p => p.Display) .HasComputedColumnSql("SOME SQL QUERY HERE?"); // Other property definitions }); // AUTHOR Definition modelBuilder.Entity<Author>(entity => { // Primary key entity.HasKey(p => p.Id); // Properties entity.Property(p => p.Id).ValueGeneratedOnAdd(); // Other property definitions }); } Desde este sitio web y otros, entiendo que puede usar consultas SQL en HasComputedColumnSql . Sin embargo, no estoy seguro de cómo abordaría la creación de este tipo de consulta para mi caso de uso.
TLDR;
¿Cómo puedo usar una clave externa en una consulta SQL para HasComputedColumnSql para establecer el valor calculado de una columna en un valor de columna de una tabla referenciada (referenciada por la clave externa)?
No puede hacer referencia a otra tabla, no es así como funcionan las columnas calculadas. Una forma es crear una función escalar y llamarla en su lugar. Por ejemplo:
CREATE FUNCTION dbo.MySuperFunction (@value INT) RETURNS INT AS BEGIN -- do stuff with other tables RETURN @value*2 ENDY en tu código C#:
entity.Properties(p => p.Display) .HasComputedColumnSql("dbo.MySuperFunction([AuthorId])");