Inicialize um objeto LINQ para SQL via lógica de negócios
-
22-08-2019 - |
Pergunta
Gostaria de estender uma classe gerada pelo LINQ para SQL para inicializar quando um novo objeto (= linha) é criado.
Quero adicionar linhas a uma tabela infantil quando a linha dos pais for criada.
Eu esperava usar o método OnCreated (parcial), faça algo assim:
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
});
}
}
O OnCreated é chamado sempre do construtor. Assim também se o objeto será carregado no banco de dados após a chamada para o OnCreated. E se o objeto for carregado no banco de dados, não deseje executar o código.
Então, onde posso adicionar lógica ao meu modelo para inicializar um objeto (-Graph)?
Solução
Eu acho que você estaria melhor nesse caso para usar uma fábrica para criar suas instâncias; Então, em qualquer lugar que você tenha código atual, como:
Product p = new Product();
Você teria: em vez disso:
Product p = ProductFactory.CreateProduct();
E seu método createproduct () seria 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;
}
Outras dicas
Não há método embutido no LINQ para as classes geradas por SQL. Eles chamam o ONLoaded especificamente quando chamados do banco de dados, mas não chamam nada quando não for. Eu suspeito porque não há como saber com certeza ...
Eu recomendo usar a abordagem de fábrica que Chris sugeriu.
Com Linq-to-SQL, as entidades são largamente Inconsciente do contexto de dados dos pais-apenas membros preguiçosos como EntitySet<T>
Saiba sobre esse detalhe. Você pode identificar os conjuntos de entidades conscientes de dados de dados, olhando para .IsDeferred
(assumindo isso é diferido) - Isso será verdade se um contexto de dados estiver envolvido e false de outra forma - mas há mais problemas:
- Linq-para-SQL anexa o Data-Context (para execução diferida) depois o construtur (e
OnCreated
) executou - Se você adicionar itens manualmente em
OnCreated
/.ctor()
, ele quebra quando o Linq-to-SQL tenta anexar o contexto de dados - Linq-to-SQL usa o construtor padrão, o que significa que genéricos/
new()
etc também compartilhará este código
Então, infelizmente; Não, acho que você não pode fazer isso em OnCreated
de qualquer maneira sensata. Você poderia:
- Tenha um segundo construtor para esse uso, que adiciona os itens extras
- Use um método de fábrica, ou seja, um estático
.Create()
Método que constrói itens corretamente
(Como o Linq-to-SQL não usará nenhum dos mesmos acima)
Se você estiver usando o designer - e presumo que você esteja porque está usando classes parciais -, pode adicionar a associação no designer e as colunas apropriadas serão adicionadas ao seu objeto automaticamente. MSDN tem uma referência em Como criar associações usando a superfície de trabalho do designer.