首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么当我尝试将新对象添加到数据库时,LINQ to SQL会认为它是空的?

为什么当我尝试将新对象添加到数据库时,LINQ to SQL会认为它是空的?
EN

Stack Overflow用户
提问于 2010-10-07 00:01:23
回答 4查看 1.8K关注 0票数 0

我正在尝试使用LINQ to SQL和ASP.NET MVC2在我的数据库表中添加一条记录。

我的控制器中填充LINQ对象的代码片段如下:

代码语言:javascript
运行
复制
/* other code removed */
        if (ModelState.IsValid)
        {
            var stream = new Genesis.Domain.Entities.Stream();

            // Handle stream
            // Is this stream new?
            if (form.StreamID == 0)
            {
                // create new stream
                stream.StreamUrl = form.StreamUrl;
                stream.StreamName = form.StreamName;
                stream.StreamBody = form.StreamBody;
                stream.StreamTitle = form.StreamTitle;
                stream.StreamKeywords = form.StreamKeywords;
                stream.StreamDescription = form.StreamDescription;

                form.StreamID = genesisRepository.CreateStream(stream); // CreateStream() returns ID as long
            }
/* other code removed */

genesisRepository.CreateStream()如下所示:

代码语言:javascript
运行
复制
public partial class SqlGenesisRepository : IGenesisRepository
{
    public long CreateStream(Stream stream)
    {
        streamTable.InsertOnSubmit(stream);
        streamTable.Context.SubmitChanges();
        return stream.StreamID;
    }
}

genesisRepository.CreateStream()被执行时,我得到这个错误:

更新为更准确的错误和堆栈跟踪

代码语言:javascript
运行
复制
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 


Line 13:         public long CreateStream(Stream stream)
Line 14:         {
Line 15:             streamTable.InsertOnSubmit(stream);
Line 16:             streamTable.Context.SubmitChanges();
Line 17:             return stream.StreamID;


Source File: C:\path\to\SqlGenesisRepositoryStreamPartial.cs    Line: 15 

Stack Trace: 


[NullReferenceException: Object reference not set to an instance of an object.]
   System.Data.Linq.Mapping.EntitySetDefSourceAccessor`2.GetValue(T instance) +18
   System.Data.Linq.Mapping.MetaAccessor`2.GetBoxedValue(Object instance) +47
   System.Data.Linq.StandardTrackedObject.HasDeferredLoader(MetaDataMember deferredMember) +106
   System.Data.Linq.StandardTrackedObject.get_HasDeferredLoaders() +107
   System.Data.Linq.StandardChangeTracker.Track(MetaType mt, Object obj, Dictionary`2 visited, Boolean recurse, Int32 level) +175
   System.Data.Linq.StandardChangeTracker.Track(Object obj, Boolean recurse) +83
   System.Data.Linq.StandardChangeTracker.Track(Object obj) +12
   System.Data.Linq.Table`1.InsertOnSubmit(TEntity entity) +183
   Genesis.Domain.Concrete.SqlGenesisRepository.CreateStream(Stream stream) in C:\Documents and Settings\bquakkelaar\Desktop\dropstuff\asp.net mvc\Genesis.0.02\Genesis.Domain\Concrete\SqlGenesisRepositoryStreamPartial.cs:15
   Genesis_0_02.Controllers.AdminStreamController.StreamEdit(StreamEditModel form) in C:\Documents and Settings\bquakkelaar\Desktop\dropstuff\asp.net mvc\Genesis.0.02\Genesis.0.02\Controllers\AdminStreamController.cs:107
   lambda_method(Closure , ControllerBase , Object[] ) +108
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +51
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +409
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +52
   System.Web.Mvc.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a() +127

当我将断点放入函数中时,我发现stream不是null。某些字符串为空。所需字符串不为空(IE: streamName = "name"),且StreamID为0

我哪里错了?

编辑:streamTable的实例化方式

我不认为我如何实例化streamTable有问题,但是考虑到我没有想法,这里的大多数人认为它是空的,下面是实例化streamTable的代码。

代码语言:javascript
运行
复制
public partial class SqlGenesisRepository : IGenesisRepository
{
    private Table<Stream> streamTable;

    public SqlGenesisRepository(string connectionString)
    {
        streamTable = (new DataContext(connectionString)).GetTable<Stream>();
    }

    public IQueryable<Stream> Streams { get { return streamTable; } }
}

在控制器类中实例化SqlGenesisRepository,如下所示:

代码语言:javascript
运行
复制
public class AdminStreamController : Controller
{
    private IGenesisRepository genesisRepository;

    public AdminStreamController()
    {
        //genesisRepository = new FakeGenesisRepository();
        genesisRepository = new SqlGenesisRepository(ConfigurationManager.ConnectionStrings["genesis"].ConnectionString);
    }
    /* rest of code removed for brevity */
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-07 04:40:54

感谢大家对这个问题的关注。

看起来我在这里发布的任何代码中都没有不正确的代码。我重新表述了我的问题,并将其发布在这里:Is there a secret to using LINQ to SQL to add records when the object has relationships?

解决方案可以在那里找到!

再次感谢。

票数 2
EN

Stack Overflow用户

发布于 2010-10-07 00:53:31

您不需要将对象附加到表,因为该对象是新对象。你只需要InsertOnSubmit。

如果在删除该行后出现空异常,则说明Stream对象可能缺少必填字段。

票数 1
EN

Stack Overflow用户

发布于 2010-10-07 00:02:44

也许streamTable是空的?

编辑

好的,根据堆栈跟踪,我认为你可能遗漏了一个外键约束。Stream有什么关系?您是否可以使用手工编码的SQL在数据库中创建一个新的Stream,仅提供此代码中已有的信息?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3874492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档