2011-02-23 81 views
7

我有一个带有“BaseEntity”和派生的“基金”实体的简单模型。 当我尝试插入一个新的基金:实体框架4:插入表格类型继承问题

HybridModelContainer container = new HybridModelContainer(); 

//Create new Fund 
Fund fund = new Fund(); 
fund.Id = Guid.NewGuid(); 
fund.DateCreated = DateTime.Now; 
fund.Name = "Fund 1"; 
fund.Number = 1; 
container.BaseEntities.AddObject(fund); 

container.SaveChanges(); 

我得到以下错误:

"Cannot insert the value NULL into column 'Id', table 'HybridData.dbo.BaseEntities'; column does not allow nulls. INSERT fails.
The statement has been terminated."

看来,分配给基金实体的ID没有插入BaseEntity表。为什么不?

我做了这个“模型第一”。如果我先设计数据库,并从中创建模型,那么一切正常......但我需要先模型!

enter image description here

也...为什么没有在ObjectSet为 “Funds” 我DataContext(即container.Funds)?在此先感谢您的帮助!

+0

什么是'HybridModelContainer'?发布你的'Fund'实体的映射细节截图。 – 2011-02-23 13:44:30

+0

这只是DataContext的名称。 – SolarX 2011-02-23 14:02:09

+0

@SolarX:你可以发表我提到的截图吗? – 2011-02-23 14:24:10

回答

9

我只能回答你的问题的第二部分:“另外...为什么我的DataContext(即container.Funds)中没有”资金“的ObjectSet?”

ObjectContext在您的类层次结构中只有一个基类ObjectSet是正常的。实际上并不需要派生类的ObjectSet。为了向/从ObjectContext添加和删除派生对象,您可以像在示例中那样使用ObjectSet<BaseEntity>/BaseEntitiesAddObjectDeleteObject方法。

对于查询派生对象,您可以利用ObjectSet的OfType方法。它返回派生类型那里您可以建立进一步查询的的ObjectQuery:

ObjectQuery<Fund> query = container.BaseEntities.OfType<Fund>(); 

(你的问题的第一部分听起来像存储和概念模型之间的映射错误它可能有CIF你更好可以显示你的EDMX文件中的相关部分)

编辑:可能解决问题的第一部分:

我已经创建了你的榜样示范,首先在VS2010,我可以复制你的问题。问题似乎与您的模型中的主键不是Int32而是Guid有关。当您为模型添加新实体时,设计师始终会建议将Int32设置为主键,并将StoreGeneratedPattern设置为Identity

如果你现在更改模型设计师Guid重点从Int32的类型,但是离开StoreGeneratedPattern不变的是Identity的DDL创建SQL Server中的数据库Id集键入uniqueidentifier但标识规范该列“没有”。

因此,当EF向数据库发送INSERT命令时,它从模型定义中“认为”主要将在数据库中自动生成,并且不会将Guid发送到您在代码中分配的数据库。但是DB不会创建密钥,导致密钥的NULL值。因此,我们得到的错误。

解决方案:在模型设计器中设置Id属性BaseEntityStoreGeneratedPatternNone。对我来说,它的工作。当然,在将一个新对象添加到ObjectSet之前,您有责任始终指定一个指向Id的Guid,但这似乎是您想要的。

+0

谢谢。我使用数据库第一种方法尝试了同样的事情,并且找到了一切(在删除关系并在模型中设置继承之后)。我无法用“模式第一”的方法来解决这个问题。但我们确实想先去模特。任何想法? – SolarX 2011-02-23 21:11:27

+0

@SolarX:也许我找到了解决方案:请参阅上面我的答案中的编辑。 – Slauma 2011-02-23 23:22:06

+0

我一会儿就会尝试这个会议......我期待着它会成为Guid的一个问题。很奇怪我在网上找不到任何东西。非常感谢你的帮助 !! – SolarX 2011-02-24 09:02:08