天天看点

EntityFramework 实体拆分和表拆分

两个概念:

实体拆分:一个实体拆分成多个表,如 Blog 实体,可以拆分成 Blogs 和 BlogDetails 两个表。

表拆分:一个表拆分成多个实体,如 Posts 表,可以拆分成 Post 和 PostDetail 两个实体。

配置代码:

映射效果:

EntityFramework 实体拆分和表拆分

测试代码:

测试结果为 Blogs 和 BlogDetails 表中,分别产生一条数据,即使 Remark 的值为空。

EntityFramework 实体拆分和表拆分

测试结果为 Posts 表中产生一条数据,注意映射配置中的这段代码:<code>modelBuilder.Entity&lt;PostDetail&gt;().HasRequired(t =&gt; t.Post).WithRequiredPrincipal(t =&gt; t.PostDetail);</code>,我们一般在外键配置的时候会用到 HasRequired,Required 表示的意思是必须,还有一种写法是:<code>modelBuilder.Entity&lt;PostDetail&gt;().HasOptional(t =&gt; t.Post).WithOptionalPrincipal(t =&gt; t.PostDetail);</code>,关键词 Optional,但映射会抱下面错误:The entity types 'Post' and 'PostDetail' cannot share table 'Posts' because they are not in the same type hierarchy or do not have a valid one to one foreign key relationship with matching primary keys between them.

其实我的想法是,在上面测试代码中,用了两个 Add(而不是一个 Add,然后用 PostDetail 属性赋值),那会不会在 Posts 表中产生两条数据,但显然没有,因为我们在映射配置的时候,使用的是 Required,可以理解为“强制合并为一个表”,不论你怎么添加数据,都会只添加一条数据,另外,需要注意的是,在上面表拆分示例中,主实体是 Post,所以,如果只有 <code>context.PostDetails.Add(new PostDetail { Remark=""});</code>,会抱下面错误:Invalid data encountered. A required relationship is missing. Examine StateEntries to determine the source of the constraint violation.

本文转自田园里的蟋蟀博客园博客,原文链接:http://www.cnblogs.com/xishuai/p/ef-entity-table-splitting.html,如需转载请自行联系原作者

继续阅读