Есть ли секрет в использовании LINQ to SQL для добавления записей, когда объект имеет отношения? - PullRequest
2 голосов
/ 06 октября 2010

Я работаю в LINQ to SQL, ASP.NET MVC и C #. У меня есть хранилище под названием genesisRepository для подключения к базе данных.

У меня есть таблица, представленная в объекте под названием Stream. Это определяется так:

[Table]
public class Stream
{
    [HiddenInput(DisplayValue = false)]
    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
    public long StreamID { get; set; }

    [Required(ErrorMessage = "Please enter a stream name")]
    [Column]
    public string StreamName { get; set; }

   /* Other columns removed for brevity */ 

    [Required(ErrorMessage = "Please enter a stream URL")]
    [Column]
    public string StreamUrl { get; set; }

    private EntitySet<StreamEntry> _StreamEntry;
    [System.Data.Linq.Mapping.Association(Storage = "_StreamEntry", OtherKey = "StreamID")]
    public EntitySet<StreamEntry> StreamEntry
    {
        get { return this._StreamEntry; }
        set { this._StreamEntry.Assign(value); }
    }

    private EntitySet<Stream2FieldTypes> _Stream2FieldTypes;
    [System.Data.Linq.Mapping.Association(Storage = "_Stream2FieldTypes", OtherKey = "StreamID")]
    public EntitySet<Stream2FieldTypes> Stream2FieldTypes
    {
        get { return this._Stream2FieldTypes; }
        set { this._Stream2FieldTypes.Assign(value); }
    }

}

В моем контроллере есть тестовое действие для создания новых записей внутри моей таблицы Stream.

    public ActionResult StreamTest()
    {
        // create new stream
        var stream = new Genesis.Domain.Entities.Stream();

        stream.StreamUrl = "url";
        stream.StreamName = "name";
        stream.StreamBody = null;
        stream.StreamTitle = null;
        stream.StreamKeywords = null;
        stream.StreamDescription = null;

        genesisRepository.CreateStream(stream); 

        return View("Index");
    }

Функция genesisRepository() выглядит следующим образом:

    public long CreateStream(Stream stream)
    {            
        streamTable.InsertOnSubmit(stream);
        streamTable.Context.SubmitChanges();
        return stream.StreamID;
    }

Я получаю ошибку нулевой ссылки при выполнении ActionResult StreamTest(). genesisRepository не является нулевым. streamTable не равен нулю, и вновь созданный объект stream также явно не равен нулю. Единственное, что я могу думать о том, что это будет нулевым, - это свойства EntitySet<T>, которые определяют внешние отношения.

Итак, я изменил код ActionResult так:

    public ActionResult StreamTest()
    {
        // create new stream
        var stream = new Genesis.Domain.Entities.Stream();

        stream.Stream2FieldTypes = new EntitySet<Stream2FieldTypes>(); // new
        stream.StreamEntry = new EntitySet<StreamEntry>(); // new
        stream.StreamUrl = "url";
        stream.StreamName = "name";
        stream.StreamBody = null;
        stream.StreamTitle = null;
        stream.StreamKeywords = null;
        stream.StreamDescription = null;

        genesisRepository.CreateStream(stream); // CreateStream() returns ID as long

        return View("Index");
    }

Но когда я попробовал это, я получил эту ошибку:

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error: 
Line 58:         {
Line 59:             get { return this._Stream2FieldTypes; }
Line 60:             set { this._Stream2FieldTypes.Assign(value); } <-- the offending line
Line 61:         }
Line 62: 
Source File: C:\path\to\Stream.cs    Line: 60 

Я могу создать новую запись, используя streamTable.Context.ExecuteCommand("INSERT INTO genesis.dbo.Stream (StreamName, StreamUrl) VALUES ('Name', 'url');");.

Я не понимаю, как двигаться дальше отсюда. Как я могу просто создать новую запись в Stream?

1 Ответ

7 голосов
/ 07 октября 2010

Попробуйте следующее. Замените это в вашем объявлении класса:

public class Stream
{   
    private EntitySet<StreamEntry> _StreamEntry;
    private EntitySet<Stream2FieldTypes> _Stream2FieldTypes;
}

с этим:

public class Stream
{   
    private EntitySet<StreamEntry> _StreamEntry = new EntitySet<StreamEntry>();
    private EntitySet<Stream2FieldTypes> _Stream2FieldTypes = new EntitySet<Stream2FieldTypes>();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...