2013-05-03 2 views
1

У меня есть глупая проблема с Linq to SQl. Я работаю только с C# в течение 3 недель, но я думал, что понимаю.C# Ошибка Linq-to-SQL на submitChanges()

Итак, теперь я тестирую свои классы (Entites and Manage classes для них), но я получаю в инициализации testclasses NullReferenceException. Я читал, что есть проблемы с частичными классами в Linq, но у меня есть только обычные классы. Кроме того, у меня много классов реализуется почти одинаково, но только в 2 (из 40) классов появляется исключение. Вот часть инициализации тестового:

 AnimalLine aL = new AnimalLine { ShortName = "Bl6", FullName = "C57Bl6N", Background = "C57Bl6N", SecureEntity = se, Phenotype = "Coat Color = Black", Species = sp }; 
    ... 
    dataContext.GetTable<TumorModel>().InsertOnSubmit(tm); 
    AnimalLineInTumorModel aLiTm = new AnimalLineInTumorModel { AnimalLineRole = alr, OntogeneticStage = os, AnimalLine = aL, TumorModel = tm }; 

    aL.AnimalLinesInTumorModels.Add(aLiTm); // <- if i outcomment this two rows, i have no exception 
    alr.AnimalLineInTumorModels.Add(aLiTm); // <- 

    os.AnimalLineInTumorModel.Add(aLiTm); 
    tm.AnimalLinesInTumorModels.Add(aLiTm); 
    dataContext.GetTable<AnimalLineInTumorModel>().InsertOnSubmit(aLiTm); 
... 
    dataContext.SubmitChanges(); 

Здесь вы найдете один из субъектов:

using System; 
using System.Collections.Generic; 
using System.Data.Linq; 
using System.Data.Linq.Mapping; 
using Tumormodelle.BusinessTierObjects.TumorModels; 

namespace Tumormodelle.BusinessTierObjects.Animals 
{ 
    [Table(Name = "AnimalLineRole")] 
    public class AnimalLineRole : EntityInterface 
    { 
     // PrimaryKey 
     [Column(Name = "AnimalLineRole_ID", IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] 
     public int AnimalLineRoleId { get; set; } 

     // normal Column 
     [Column(Name = "AnimalLineRole_Name", CanBeNull = false)] 
     public string Name { get; set; } 

     // ForeignKey to AnimalLineInTumorModel (1:M) 
     private EntitySet<AnimalLineInTumorModel> _AnimalLineInTumorModels = new EntitySet<AnimalLineInTumorModel>(); 
     [Association(Name = "FK_AnimalLineInTumorModel_AnimalLineRole", IsForeignKey = true, Storage = "_AnimalLineInTumorModels", ThisKey = "AnimalLineRoleId", OtherKey = "AnimalLineRoleId")] 
     public ICollection<AnimalLineInTumorModel> AnimalLineInTumorModels 
     { 
      get { return _AnimalLineInTumorModels; } 
      set { _AnimalLineInTumorModels.Assign(value); } 
     } 
    } 
} 

Здесь с другой стороны:

using System; 
using System.Collections.Generic; 
using System.Data.Linq; 
using System.Data.Linq.Mapping; 
using Tumormodelle.BusinessTierObjects.Animals; 

namespace Tumormodelle.BusinessTierObjects.TumorModels 
{ 
    [Table(Name = "AnimalLineInTumorModel")] 
    public class AnimalLineInTumorModel : EntityInterface 
    { 
     // PrimaryKey 
     [Column(Name = "AnimalLineInTumorModel_ID", IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] 
     public int AnimalLineInTumorModelId { get; set; } 

     // ForeignKey to AnimalLineRole (M:1) 
     [Column(Name = "AnimalLineInTumorModel_FK_Role", CanBeNull=false)] 
     private int? AnimalLineRoleId; 
     private EntityRef<AnimalLineRole> _AnimalLineRole = new EntityRef<AnimalLineRole>(); 
     [Association(Name = "FK_AnimalLineInTumorModel_AnimalLineRole", IsForeignKey = true, Storage = "_AnimalLineRole", ThisKey = "AnimalLineRoleId", OtherKey = "AnimalLineRoleId")] 
     public AnimalLineRole AnimalLineRole 
     { 
      get { return _AnimalLineRole.Entity; } 
      set { _AnimalLineRole.Entity = value; } 
     } 

     // ForeignKey to AnimalLine (M:1) 
     [Column(Name = "AnimalLineInTumorModel_FK_AnimalLine", CanBeNull = false)] 
     private int? AnimalLineId; 
     private EntityRef<AnimalLine> _AnimalLine = new EntityRef<AnimalLine>(); 
     [Association(Name = "FK_AnimalLineInTumorModel_AnimalLine", IsForeignKey = true, Storage = "_AnimalLine", ThisKey = "AnimalLineId", OtherKey = "AnimalLineId")] 
     public AnimalLine AnimalLine 
     { 
      get { return _AnimalLine.Entity; } 
      set { _AnimalLine.Entity = value; } 
     } 

     // ForeignKey to OntogeneticStage (M:1) 
     [Column(Name = "AnimalLineInTumorModel_FK_OntogeneticStage", CanBeNull = false)] 
     private int? OntogeneticStageId; 
     private EntityRef<OntogeneticStage> _OntogeneticStage = new EntityRef<OntogeneticStage>(); 
     [Association(Name = "FK_AnimalLineInTumorModel_OntogeneticStage", IsForeignKey = true, Storage = "_OntogeneticStage", ThisKey = "OntogeneticStageId", OtherKey = "OntogeneticStageId")] 
     public OntogeneticStage OntogeneticStage 
     { 
      get { return _OntogeneticStage.Entity; } 
      set { _OntogeneticStage.Entity = value; } 
     } 

     ... 
    } 
} 

Тут другое лицо без каких-либо проблем , Это очень похоже:

using System; 
using System.Collections.Generic; 
using System.Data.Linq; 
using System.Data.Linq.Mapping; 
using Tumormodelle.BusinessTierObjects.TumorModels; 

namespace Tumormodelle.BusinessTierObjects.Animals 
{ 
    [Table(Name="OntogeneticStage")] 
    public class OntogeneticStage : EntityInterface 
    { 
     // Primärschlüssel 
     [Column(Name = "OntogeneticStage_ID", IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] 
     public int OntogeneticStageId { get; set; } 

     // Normale Tabelleneinträge 
     [Column(Name = "OntogeneticStage_Name", CanBeNull = false)] 
     public string Name { get; set; } 

     // Fremdschlüssel zu AnimalLineInTumorModel (1:M) 
     private EntitySet<AnimalLineInTumorModel> _AnimalLineInTumorModel = new EntitySet<AnimalLineInTumorModel>(); 
     [Association(Name = "FK_AnimalLineInTumorModel_OntogeneticStage", Storage = "_AnimalLineInTumorModel", OtherKey = "OntogeneticStageId", ThisKey = "OntogeneticStageId")] 
     public ICollection<AnimalLineInTumorModel> AnimalLineInTumorModel 
     { 
      get { return _AnimalLineInTumorModel; } 
      set { _AnimalLineInTumorModel.Assign(value); } 
     } 
    } 
} 

Все они будут выглядеть почти одинаково. И вот код SQL для генерации таблицы:

dataContext.ExecuteCommand("CREATE TABLE [dbo].[AnimalLineRole] 
([AnimalLineRole_ID] INT IDENTITY (1, 1) , 
[AnimalLineRole_AutoDate] DATETIME CONSTRAINT 
[DF_AnimalLineRole_AnimalLineRole_AutoDate] DEFAULT (getdate()) , 
[AnimalLineRole_Timestamp] ROWVERSION , 
[AnimalLineRole_Comments] NVARCHAR (255) NULL, 
[AnimalLineRole_Name] NVARCHAR (255) NULL, 
CONSTRAINT [PK_AnimalLineRole] PRIMARY KEY CLUSTERED ([AnimalLineRole_ID] ASC));"); 

Я полностью сбил эту проблему. Отладчик не может мне помочь. al != null, alr != null и aLiTm != null. Откуда взялись NullReferenceException?

О, кстати. Интерфейс EntityInterface пуст и просто для обозначения некоторых неспецифических объектов в других методах. В нем нет кода.

Благодарим за внимание.

+0

Linq to SQL не рекомендуется для новых проектов. Во всех смыслах и целях он устарел для Linq для EntityFramework – Aron

+0

Я вижу, что у вас есть другие отношения. Поскольку «AnimalLine» не размещен здесь, проверьте, требуется ли какое-либо из его отношений **. **. Если это так, то вы должны предоставить связанный объект, потому что связанный объект не может быть нулевым. – noobob

+0

@noobob: они должны только показать, что у них нет проблем, и они выглядят похожими на класс с проблемой. Для примера я редактировал другой объект, который запускает. – Jastol

ответ

1

Вы создали новый экземпляр AnimalLineaL, но у вас нет коллекции AnimalLinesInTumorModels (следовательно, NullReferenceException).

Вы должны инициализировать коллекцию для instace:

aL.AnimalLinesInTumorModels = new AnimalLinesInTumorModels(); 

Вы также можете назначить это в aL инициализаторе объекта.

+0

Если id делает так vs said: «не было экземпляра абстрактного класса или интерфейса, который будет создан». Также я не делаю этого в любом другом классе (сущности), и все они будут работать. – Jastol

+0

Также я проверил его в отладчике. ICollections определенно! = Null. – Jastol

 Смежные вопросы

  • Нет связанных вопросов^_^