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)?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top