Sol*_*arX 7 c# inheritance entity-framework entity-framework-4
我有一个简单的模型,带有"BaseEntity"和派生的"Fund"实体.当我尝试插入新基金时:
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();
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
"无法将值NULL插入列'Id',表'HybridData.dbo.BaseEntities';列不允许空值.INSERT失败.
语句已终止."
似乎分配给基金实体的ID未插入BaseEntity表中.为什么不?
我做了这个"模特第一".如果我先设计数据库,并从中创建模型,一切正常....但我需要先模型!

另外......为什么我的(即)中没有ObjectSet" Funds" ?在此先感谢您的帮助!DataContextcontainer.Funds
我只能回答你问题的第二部分:"另外......为什么我的DataContext中没有"基金"的ObjectSet(即container.Funds)?"
ObjectContext在类层次结构中只有一个基类的ObjectSet是正常的.实际上并不需要派生类的ObjectSet.对于添加和删除派生对象/从ObjectContext中,你可以只使用AddObject和DeleteObject方法ObjectSet<BaseEntity>/ BaseEntities因为你已经在你的例子一样.
对于查询派生对象,您可以利用OfTypeObjectSet 的方法.它返回派生类型的ObjectQuery,您可以在其中构建进一步的查询:
ObjectQuery<Fund> query = container.BaseEntities.OfType<Fund>();
Run Code Online (Sandbox Code Playgroud)
(问题的第一部分听起来像存储和概念模型之间的映射错误.它可能有更好的cif,你可以显示你的edmx文件的相关部分.)
编辑:问题第一部分的可能解决方案:
我已经在VS2010中使用Model-first创建了您的示例,我可以重现您的问题.问题似乎与模型中的主键不是a Int32而是a 的事实有关Guid.当您向模型添加新实体时,设计器始终建议将Int32主键StoreGeneratedPattern设置为Identity.
如果您现在更改从模型设计的关键类型Int32来Guid,但离开StoreGeneratedPattern不变的是Identity,在DDL创建SQL Server中的数据库Id设置为类型uniqueidentifier,但该列标识规范是"否".
因此,当EF向DB发送INSERT命令时,它会从模型定义中"思考"主数据库将在数据库中自动生成,并且不会将Guid发送到您在代码中分配的数据库.但是DB不会创建密钥,导致密钥为NULL值.因此我们得到的错误.
解决方案:在模型设计器Id中BaseEntity设置StoreGeneratedPatternto 的属性None.对我而言,它起作用了.当然,Id在将新对象添加到ObjectSet之前,您有责任始终指定Guid ,但这似乎是您想要的.
| 归档时间: |
|
| 查看次数: |
3408 次 |
| 最近记录: |