一个影片信息Clips表,四个字段:clipId,clipName,fileSize,fileName

方案一:

    [Table("Clips")]
public class Clip
{
public Clip()
{
File = new ClipFile();
} [Key]
[Column("clipId")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; } [Column("clipName")]
public string Name { get; set; } public ClipFile File { get; set; }
} [ComplexType]
public class ClipFile
{
[Column("fileSize")]
public string Size { get; set; } [Column("fileName")]
public string Name { get; set; }
}

缺点:ClipFile不会延迟加载,无论你ClipFile申明是否为virtual的。

方案二:

[Table("Clips")]
public class Clip
{
[Key]
[Column("clipId")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[ForeignKey("FileOf")]
public int Id { get; set; } [Column("clipName")]
public string Name { get; set; } //[Required]
public virtual ClipFile FileOf { get; set; }
} [Table("Clips")]
public class ClipFile
{
[Key]
[Column("clipId")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[ForeignKey("ClipOf")]
public int Id { get; set; } [Column("fileSize")]
public string Size { get; set; } [Column("fileName")]
public string Name { get; set; } //[Required]
public virtual Clip ClipOf { get; set; }
}

这种方案也存在问题,不Include调用关联virtual实体类,永远是null,不支持延迟加载,很是郁闷。SqlServer据说可以解决,MySql我是没有找到解决方案。

还有就是构造函数一定不要去new附属实体类,会进入死循环。

方案三:使用TPH(Table per Hierarchy)

public abstract class ClipBase
{
[Key]
[Column("clipId")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; } [Column("clipName")]
public string Name { get; set; }
} public class ClipFile : ClipBase
{
[Column("fileName")]
public string FileName { get; set; }
} public class ClipSize : ClipBase
{
[Column("fileSize")]
public int Size { get; set; }
}

而且必须是用Fluent API进行配置,还必须为Clips添加字段Discriminator(字段名称和类型都可以根据自己需要进行修改),这个字段的值用于区分是哪个类的数据,所以务必保证每个派生类的HasValue值不相同。

modelBuilder.Entity<ClipBase>().Map(m=>
{
m.ToTable("Clips");
//m.Requires("Discriminator").HasValue("0"); //如果ClipBase不申明为抽象类这需要用此加以区分
})
.Map<ClipFile>(m => m.Requires("Discriminator").HasValue(""))
.Map<ClipSize>(m => m.Requires("Discriminator").HasValue(""));

创建对象可以用基类的DbSet进行添加,也可以用派生类自己的DbSet进行添加。选取的时候你可以基类的DbSet.OfType<ClipFile>(),也可以用派生类自己的DbSet。

但是这种方案多实体其实就导致数据虽然在一个表,但是内容无法在三个类中共享了,失去了原有的设计初衷。

最新文章

  1. Java关于Properties用法(二)——替换配置文件中的参数
  2. 洛谷P1134 阶乘问题[数论]
  3. 转:V$SQL,V$SQLAREA,V$SQLTEXT
  4. subline快捷键
  5. 转载:为什么要对URI进行编码
  6. iOS之GCD的DEMO
  7. 【WebKit】---WebKit的CSS扩展(WebKit是私有属性)
  8. 如何在CentOS 5.x 中安装Windows Azure Linux Agent (WALA)
  9. STM32F0308开发环境的选择--CooCox CoIDE篇
  10. 学习了LINUX下用C语言遍历文件夹,一些心得
  11. WAS ND集群中的HTTP内存会话复制对Java应用程序序列化编程的要求
  12. 理解 Python 中的线程
  13. 穷举 迭代 while
  14. iOS tableViewCell 在cell赋值、网络加载照片位置偏移大小错乱,做一个类似qq列表的tableview 更新3
  15. Docker系统八:Docker的存储驱动
  16. php正则匹配
  17. dubbo实用知识点总结(二)
  18. android 混淆基本知识
  19. Windows运行python脚本文件
  20. Unix环境高级编程(八)进程关系

热门文章

  1. MySQL命令实例
  2. SPFA+寻路(行路难,洛谷2832)
  3. flask-admin众博客概述
  4. Java getResourceAsStream() 方法会缓存文件的问题
  5. ue4 FPaths各目录
  6. AC算法 及python实现
  7. Crystal Reports拉报表报错:Error detected by database DLL
  8. The import java.io cannot be resolved
  9. 用ajax动态获取数据显示在highcharts上
  10. 如何让你的UWP应用程序无缝调用几何作图