Linq到SQL更新-分离后更新时出现NullReferenceException

Linq到SQL更新-分离后更新时出现NullReferenceException,linq,linq-to-sql,linq-to-entities,Linq,Linq To Sql,Linq To Entities,我目前无法理解为什么我的样式实体存储库中的更新方法在我的Linq到SQL域模型层中抛出NullReferenceException。问题似乎是,在必要地使用分离方法之后,我正在更新的样式对象上的EntitySet Product属性为空。在提交更改之前,会在附加上引发实际异常 我的更新只是针对样式表,产品引用不应该真正进入样式表,但关系映射在SQLMetal生成的代码中,这是我的应用程序设计的一个重要部分 如果删除外键关系,重新创建映射类并相应地调整代码,问题就会消失。不过,如果可能的话,我想与

我目前无法理解为什么我的样式实体存储库中的更新方法在我的Linq到SQL域模型层中抛出NullReferenceException。问题似乎是,在必要地使用分离方法之后,我正在更新的样式对象上的
EntitySet Product
属性为空。在提交更改之前,会在附加上引发实际异常

我的更新只是针对样式表,产品引用不应该真正进入样式表,但关系映射在SQLMetal生成的代码中,这是我的应用程序设计的一个重要部分

如果删除外键关系,重新创建映射类并相应地调整代码,问题就会消失。不过,如果可能的话,我想与外方建立关键关系

我将尝试最好地解释设置:

SQL server数据库中的关系如下,产品表引用样式表:

实体映射类是用SQLMetal创建的,据我所知,它的生成方式没有什么不寻常之处

更新方法为:

public Style Update(Style style)
    {
        using (var dc = new ProjectERPDataContext(Config.ConnectionStringERPDB))
        {
            style.Detach();

            dc.Style.Attach(style);
            dc.Refresh(RefreshMode.KeepCurrentValues, style);
            dc.SubmitChanges();

            return style;
        }
    }
[Table(Name="dbo.Style")]
public partial class Style : INotifyPropertyChanging, INotifyPropertyChanged
{

    private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

    private int _ID;

    private string _Name;

    private EntitySet<Product> _Product;
    System.NullReferenceException : Object reference not set to an instance of an object.
at System.Data.Linq.Mapping.EntitySetDefSourceAccessor`2.GetValue(T instance)
at System.Data.Linq.Mapping.MetaAccessor`2.GetBoxedValue(Object instance)
at System.Data.Linq.ChangeTracker.StandardChangeTracker.StandardTrackedObject.HasDeferredLoader(MetaDataMember deferredMember)
at System.Data.Linq.ChangeTracker.StandardChangeTracker.StandardTrackedObject.get_HasDeferredLoaders()
at System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(MetaType mt, Object obj, Dictionary`2 visited, Boolean recurse, Int32 level)
at System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(Object obj, Boolean recurse)
at System.Data.Linq.Table`1.Attach(TEntity entity, Boolean asModified)
at ProjectERP.DomainModel.Repositories.SQLStyleRepo.Update(Style style) in SQLStyleRepo.cs: line 45
at ProjectERP.UnitTests.DomainModel.SQLStyleRepoTests.Test_can_update_style() in SQLStyleRepoTests.cs: line 67 
分离方法保存在分部类中:

public Style Update(Style style)
    {
        using (var dc = new ProjectERPDataContext(Config.ConnectionStringERPDB))
        {
            style.Detach();

            dc.Style.Attach(style);
            dc.Refresh(RefreshMode.KeepCurrentValues, style);
            dc.SubmitChanges();

            return style;
        }
    }
[Table(Name="dbo.Style")]
public partial class Style : INotifyPropertyChanging, INotifyPropertyChanged
{

    private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

    private int _ID;

    private string _Name;

    private EntitySet<Product> _Product;
    System.NullReferenceException : Object reference not set to an instance of an object.
at System.Data.Linq.Mapping.EntitySetDefSourceAccessor`2.GetValue(T instance)
at System.Data.Linq.Mapping.MetaAccessor`2.GetBoxedValue(Object instance)
at System.Data.Linq.ChangeTracker.StandardChangeTracker.StandardTrackedObject.HasDeferredLoader(MetaDataMember deferredMember)
at System.Data.Linq.ChangeTracker.StandardChangeTracker.StandardTrackedObject.get_HasDeferredLoaders()
at System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(MetaType mt, Object obj, Dictionary`2 visited, Boolean recurse, Int32 level)
at System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(Object obj, Boolean recurse)
at System.Data.Linq.Table`1.Attach(TEntity entity, Boolean asModified)
at ProjectERP.DomainModel.Repositories.SQLStyleRepo.Update(Style style) in SQLStyleRepo.cs: line 45
at ProjectERP.UnitTests.DomainModel.SQLStyleRepoTests.Test_can_update_style() in SQLStyleRepoTests.cs: line 67 
detach方法存在,因为如果没有,将引发异常:“试图附加或添加一个非新实体,可能是从另一个DataContext加载的。这是不受支持的。”


我打赌原因是你在这里埋下的定时炸弹:

this._Product = default(EntitySet<Product>);

你能给我们看一下那个异常的堆栈跟踪吗?刚刚添加了它。不要放弃太多!谢谢,这让我的考试通过了。我仍在加深对Linq SQL的理解。你能解释一下为什么我必须把它设置为新的而不是默认的吗。我已经成功地将默认值与默认值(EntityRef)一起用于其他类。我想这里的区别是这是一个EntitySet,不是EntityRef?我不想在我的申请中有任何“定时炸弹”!到目前为止,我的理解来自:@bombdeffuse:(哇,刚刚注意到你的屏幕名。定时炸弹不是双关语)因为L2S希望在那里找到一个场景,即使是空的
null
不是一个空集合,而是缺少集合。这就是为什么会出现NullReferenceException。在EntityRefs中,L2可能在那里有一个ref,也可能没有。它使用
null
来实现这一点。别问为什么,不是我设计的。