【问题标题】:Entity Framework with POCO Template and FKs in Model - Null Ref Exception模型中具有 POCO 模板和 FK 的实体框架 - 空引用异常
【发布时间】:2011-05-26 19:05:29
【问题描述】:

我正在使用 Entity Framework 4 和从 Visual Studio 库下载的 Microsoft 的 POCO 代码生成模板。从数据库生成 EF 模型时,我还选择了“在模型中包含外键”的默认选项。

我已经能够用一个非常简单的模型重现这个问题,在可选的一对多关系中只有两个表/类。在本例中,我使用的是地址和人员。一个人可以有一个或零个地址,一个地址可以有零到多个人。

表格如下所示:

CREATE TABLE [dbo].[Person](
    [PersonID] [uniqueidentifier] NOT NULL,
    [FirstName] [nvarchar](50) NULL,
    [LastName] [nvarchar](50) NULL,
    [AddressID] [uniqueidentifier] NULL,
 CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonID] ASC )

 CREATE TABLE [dbo].[Address](
    [AddressID] [uniqueidentifier] NOT NULL,
    [Street1] [nvarchar](50) NOT NULL,
    [Street2] [nvarchar](50) NULL,
    [City] [nvarchar](50) NOT NULL,
    [State] [char](2) NOT NULL,
    [Country] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Address] PRIMARY KEY CLUSTERED ([AddressID] ASC)

ALTER TABLE [dbo].[Person]  WITH CHECK ADD  CONSTRAINT [FK_Person_Address] 
FOREIGN KEY([AddressID])
REFERENCES [dbo].[Address] ([AddressID])

当我尝试创建一个 Address 对象并将其添加到从数据库中提取的现有 Person 对象中时,我得到一个空引用异常:

TestPOCOEntities ctx = new TestPOCOEntities();

var person = ctx.People.FirstOrDefault(p => p.PersonID == new Guid("58AD37B4-1EBE-4649-940C-A141732C9901"));

var addr = new Address {AddressID = Guid.NewGuid(), Street1 = "123 Main St"};
person.Address = addr; // This line throws the exception

ctx.SaveChanges();

深入调用堆栈,异常不是从我的代码中抛出,甚至不是模板生成的代码,而是在 AddressID setter 中 Person 类的运行时动态代理中。 (具体来说,System.Data.Objects.EntityEntry.FixupEntityReferenceByForeignKey(EntityReference reference) 方法。)

如果我使用默认的 EF 代码生成而不是 POCO 模板,则不会发生此异常。如果我使用 POCO 模板但在从数据库生成模型时取消选中“在模型中包含外键”复选框,也不会发生这种情况。

如果我添加以下内容,我可以让错误消失:

var addr = new Address {AddressID = Guid.NewGuid(), Street1 = "123 Main St"};
ctx.Addresses.AddObject(addr); // Adding this line...
person.Address = addr; // Means no more exception here!

我不明白为什么在与我的持久对象交互时,使用 POCO 模板和在模型中包含外键的组合需要进行这种代码更改。这是一个已知的错误?我错过了什么吗?这是出于某种原因设计的吗?

【问题讨论】:

  • 有趣..我使用 POCO 并没有'有这个问题(虽然我没有在模型中包含 FK - 我没有看到一点)。
  • @RPM1982 - 是的,就是这样。如果我不包括 FK,问题就会消失。
  • 出于好奇,为什么您将 FK 包含在模型中?导航属性通常就足够了。
  • EF 代码中的 NullReferenceException 是 EF 中的错误。你应该报告给connect.microsoft.com
  • @Simon Mourier - 你怎么知道这是一个 EF 错误?你是从哪里得出这个结论的?

标签: entity-framework efpocoadapter


【解决方案1】:

这是 EF 的一个潜在 bug,通常然后刷新创建的实体(用新数据重新保存更改)解决方案:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/832af255-d1c2-41d5-9e95-9cdf3b15bb57

作弊是先将实体添加到集合上下文中

第二次分配给父实体

第三,正常保存更改!

享受

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多