Pregunta

Me gustaría extender una clase generada por LINQ to SQL para inicializar cuando se crea un nuevo objeto (= fila).

Quiero añadir filas a una tabla secundaria cuando se crea una fila padre.

Tenía la esperanza de utilizar el método de Oncreated (parcial) hacer algo como esto:

partial class Product {
    partial void OnCreated() {
        // Fill default rows for FK relations
        this.Columns.Add(new ProductColumn {
            Name = "Name", ColumnType = 1
        });
        this.Columns.Add(new ProductColumn {
            Name = "Producer", ColumnType = 2
        });
    }
}

El OnCreated se llama cada vez que desde el constructor. Así también si el objeto se carga desde la base de datos después de la llamada a OnCreated. Y si el objeto se carga desde la base de datos, no quiero para ejecutar el código.

Entonces, ¿dónde puedo añadir lógica a mi modelo para inicializar un objeto (-graph)?

¿Fue útil?

Solución

Creo que estaría mejor en este caso utilizar una fábrica para crear las instancias; Así que en cualquier lugar que la corriente tiene un código como:

Product p = new Product();

Se podría tener lugar:

Product p = ProductFactory.CreateProduct();

Y su método de CreateProduct () sería algo como:

public Product CreateProduct()
{
    var p = new Product();
    p.Columns.Add(new ProductColumn {
        Name = "Name", ColumnType = 1
    });
    p.Columns.Add(new ProductColumn {
        Name = "Producer", ColumnType = 2
    });
    return p;
}

Otros consejos

No hay construido en el método para ello en el LINQ a SQL clases generadas. Llaman onLoaded específicamente cuando se llama desde la base de datos, pero no llaman nada cuando no lo es. Sospecho porque no hay manera de saber con certeza ...

Me gustaría recomendar el uso del enfoque de la fábrica que Chris sugirió.

Con LINQ a SQL, las entidades son en gran medida inconscientes de los padres de datos de contexto - sólo usuarios perezosos-cargado como EntitySet<T> conocer este detalle. Puede identificar al contexto de datos conscientes entidad conjuntos examinado .IsDeferred (suponiendo que es diferido) - esto será cierto si un contexto de datos está involucrado, y falso en caso contrario - pero hay más problemas:

  • LINQ-to-SQL concede los datos de contexto (por ejecución diferida) después el constructur (y OnCreated) ha ejecutado
  • Si agrega elementos manualmente en OnCreated / .ctor(), se rompe cuando LINQ a SQL intenta adjuntar los datos del contexto
  • LINQ a SQL utiliza el constructor por defecto, lo que significa que los genéricos / new() etc también compartirá el código

Así que por desgracia; no, yo no creo que se puede hacer esto en OnCreated de ninguna manera sensata. Usted podría:

  • tener un segundo constructor para este uso, que añade los elementos adicionales
  • utilizar un método de fábrica, es decir, un método .Create() estática que se artículos correctamente

(desde LINQ-to-SQL no va a usar cualquiera de los anteriores en sí)

Si está utilizando el diseñador - y supongo que usted es porque está utilizando las clases parciales - se puede añadir la asociación en el diseñador y las columnas correspondientes se agregarán a su objeto automáticamente. MSDN tiene una referencia en cómo crear asociaciones utilizando la superficie de trabajo del diseñador .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top