Pergunta

Eu tenho este código:

using DC = MV6DataContext;
using MV6; // Business Logic Layer
// ...

public DC.MV6DataContext dc = new DC.MV6DataContext(ConnectionString);
IP ip = new IP(Request.UserHostAddress);
dc.IPs.InsertOnSubmit(ip);
dc.SubmitChanges();

// in Business Logic layer:
public class IP : DC.IP {
  public IP(string address) { ... }
}

Ao tentar insertonsubmit (IP), recebo uma NullReferenceException (referência do objeto não definida como uma instância de um objeto). DC não é nulo; IP e todas as propriedades do IP não são nulas; Embora alguns estejam vazios.

O VS2008 não me deixa entrar no Insertonsubmit, então não tenho como saber o que especificamente é nulo ao ser avaliado. O que da?

NOTA: Eu verifiquei e todos os linq.EntitySets criados por relacionamentos com FK estão presentes e não nulos.

Foi útil?

Solução 2

Entendi.

Em vez de criar uma classe que herda da classe Datacontext, estendo a classe CC em si com uma classe parcial na camada lógica de negócios. A partir daí, posso adicionar quaisquer construtores e métodos que eu desejar.

Nesse caso, é necessário copiar o código do construtor existente (gerado automaticamente):

public IP(string address) {
Address = address;
Domain = "";
Notes = "";
FirstAccess = DateTime.Now;
LastAccess = DateTime.Now;
this._Sessions = new EntitySet<Session>(new Action<Session>(this.attach_Sessions), new Action<Session>(this.detach_Sessions));
OnCreated(); }

Não tenho certeza do que está naquele manipulador criado, mas parece estar fazendo o trabalho que me desossou mais cedo. Funciona bem agora :)

Outras dicas

Na verdade, é melhor adicionar uma chamada ao seu construtor que também chama o construtor genérico, como:

public IP(string address) : this() {
...
}

Como o construtor padrão já inicializa base (), this._sessions e executa o método OnCreated, tudo o que você precisa fazer no seu construtor estendido é o seguinte:

public IP(string address) : this()
{
    Address = address;
    Domain = "";
    Notes = "";
    FirstAccess = DateTime.Now;
    LastAccess = DateTime.Now;
}

Isso é um datacontext gerado por designer ou seu próprio. Suspeito que a mesa IPS não seja instanciada no momento em que você tenta o seu InsertOnSubmit(). Não consigo ver como isso aconteceria com um datacontext gerado por designers, mas sou conhecido por esquecer de inicializar minhas coleções de tempos em tempos em meu próprio código.

Você pode tentar ver o que está acontecendo, o que as mudanças serão feitas, se você colocar um ponto de interrupção antes de se submeter e fazer um relógio rápido de dc.getChangeset ().

I had a slightly different situation than the asker, but got the same error for the same reasons. I wrote new constructors in a partial class for my database entities, then tried to use the resulting objects in InsertOnSubmit calls.

None of these answers helped me directly, but I was able to figure out what they were getting at after reading all of them.

The auto-generated parameterless constructor for the entity does things that need to happen for InsertOnSubmit to work, so if you overload the constructor -- like me -- or inherit from the class -- like the asker -- you need to call the base constructor from your new constructor, like so:

public partial class Entity {
    public Entity( Type parameter ) : this() {
        // do things with the parameter
    }
}

or

public class SubEntity: Entity {
    public SubEntity( Type parameter ) : base() {
        // do things with the parameter
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top