为什么LINQ to SQL中认为认为我的新对象为空时,我尝试将其添加到数据库? [英] Why does LINQ to SQL think think that my new object is null when I try to add it to the database?

查看:138
本文介绍了为什么LINQ to SQL中认为认为我的新对象为空时,我尝试将其添加到数据库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将记录添加到使用LINQ to SQL和ASP.NET MVC 2我的数据库表。

这是填充LINQ对象在我的控制器中的片段是这样的:

  / *其他code删除* /
        如果(ModelState.IsValid)
        {
            VAR流=新Genesis.Domain.Entities.Stream();            //处理流
            //这是流新?
            如果(form.StreamID == 0)
            {
                //创建新的流
                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(流); // CreateStream()返回ID只要
            }
/ *其他code删除* /

genesisRepository.CreateStream()是这样的:

 公共部分类SqlGenesisRepository:IGenesisRepository
{
    众长CreateStream(流流)
    {
        streamTable.InsertOnSubmit(流);
        streamTable.Context.SubmitChanges();
        返回stream.StreamID;
    }
}

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

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

 说明:当前Web请求的执行过程中发生未处理的异常。请查看有关错误的详细信息的堆栈跟踪以及它起源于code。异常详细信息:System.NullReferenceException:对象不设置到对象的实例。源错误:
第13行:众长CreateStream(流流)
第14行:{
第15行:streamTable.InsertOnSubmit(流);
第16行:streamTable.Context.SubmitChanges();
第17行:返回stream.StreamID;
源文件:C:\\路径\\为\\ SqlGenesisRepositoryStreamPartial.cs线:15堆栈跟踪:
[NullReferenceException:未将对象引用不设置到对象的实例。]
   System.Data.Linq.Mapping.EntitySetDefSourceAccessor`2.GetValue(T实例)+18
   System.Data.Linq.Mapping.MetaAccessor`2.GetBoxedValue(对象实例)+47
   System.Data.Linq.StandardTrackedObject.HasDeferredLoader(MetaDataMember deferredMember)+106
   System.Data.Linq.StandardTrackedObject.get_HasDeferredLoaders()+107
   System.Data.Linq.StandardChangeTracker.Track(MT元类型,obj对象,Dictionary`2走访,布尔递归,的Int32级)+175
   System.Data.Linq.StandardChangeTracker.Track(obj对象,布尔递归)+83
   System.Data.Linq.StandardChangeTracker.Track(obj对象)+12
   System.Data.Linq.Table`1.InsertOnSubmit(TEntity实体)183
   Genesis.Domain.Concrete.SqlGenesisRepository.CreateStream(流流)在C:\\ Documents和Settings \\ bquakkelaar \\桌面\\ dropstuff \\ asp.net mvc的\\ Genesis.0.02 \\ Genesis.Domain \\混凝土\\ SqlGenesisRepositoryStreamPartial.cs:15
   Genesis_0_02.Controllers.AdminStreamController.StreamEdit(StreamEditModel形式)在C:\\ Documents和Settings \\ bquakkelaar \\桌面\\ dropstuff \\ asp.net mvc的\\ Genesis.0.02 \\ Genesis.0.02 \\ \\控制器AdminStreamController.cs:107
   lambda_method(封闭,ControllerBase,对象[])+108
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase控制器,对象[]参数)+51
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary`2参数)409
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary`2参数)+52
   System.Web.Mvc<方式>&c__DisplayClassd LT; InvokeActionMethodWithFilters> b__a()+127

当我把一个断点到函数,我看到不为空。一些字符串为空。需要字符串不空(IE:streamName中=名称)和流ID为 0

我在哪里去了?

编辑:如何`streamTable`是实例化

我不认为是我怎么例如 streamTable ,但看到一个问题,因为我怎么离开这里的想法,大多数人认为这是空,这里是code的情况下, streamTable

 公共部分类SqlGenesisRepository:IGenesisRepository
{
    私人表<流> streamTable;    公共SqlGenesisRepository(字符串的connectionString)
    {
        streamTable =(新的DataContext(的connectionString)) - 的GetTable LT;流>();
    }    公众的IQueryable<流>流{{返回streamTable; }}
}

而SqlGenesisRepository在这样的控制器类实例化:

 公共类AdminStreamController:控制器
{
    私人IGenesisRepository genesisRepository;    公共AdminStreamController()
    {
        // genesisRepository =新FakeGenesisRepository();
        genesisRepository =新SqlGenesisRepository(ConfigurationManager.ConnectionStrings [创世纪]的ConnectionString);
    }
    / * code其余为简洁起见删除* /
}


解决方案

感谢大家注意这个问题。

看起来不正确的code是不是在任何code我张贴在这里的。我改写我的问题在这里贴吧:<一href=\"http://stackoverflow.com/questions/3876360/is-there-a-secret-to-using-linq-to-sql-to-add-records-when-the-object-has-relatio/3876546#3876546\">http://stackoverflow.com/questions/3876360/is-there-a-secret-to-using-linq-to-sql-to-add-records-when-the-object-has-relatio/3876546#3876546.

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

再次感谢。

I am trying to add a record to my database table using LINQ to SQL and ASP.NET MVC 2.

The snippet in my controller that populates the LINQ object is this:

/* 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 */

The genesisRepository.CreateStream() looks like this:

public partial class SqlGenesisRepository : IGenesisRepository
{
    public long CreateStream(Stream stream)
    {
        streamTable.InsertOnSubmit(stream);
        streamTable.Context.SubmitChanges();
        return stream.StreamID;
    }
}

When genesisRepository.CreateStream() gets executed, I get this error:

Updated to more accurate error and stacktrace

    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

When I put a breakpoint into the function, I see that stream is not null. Some strings are null. Required strings are not null (IE: streamName = "name") and StreamID is 0.

Where am I going wrong?

Edit: How `streamTable` is instanced

I don't think there is a problem with how I instance streamTable but seeing as how I out of ideas and most people here think that it's null, here is the code that instances streamTable.

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; } }
}

And the SqlGenesisRepository is instanced in the controller class like this:

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 */
}

解决方案

Thanks to everyone for the attention to this issue.

It looks like the incorrect code wasn't in any of the code I posted here. I rephrased my question and posted it here: http://stackoverflow.com/questions/3876360/is-there-a-secret-to-using-linq-to-sql-to-add-records-when-the-object-has-relatio/3876546#3876546.

The solution can be found there!

Thanks again.

这篇关于为什么LINQ to SQL中认为认为我的新对象为空时,我尝试将其添加到数据库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆