对Entity Framework Core中完全定义的关系的误解

时间:2016-03-15 10:08:54

标签: c# entity-framework entity-framework-core

让我们看看official docs

中的示例
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public BlogImage BlogImage { get; set; }
}

public class BlogImage
{
    public int BlogImageId { get; set; }
    public byte[] Image { get; set; }
    public string Caption { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
} 

正如我们所看到的,我们已经完全定义了Blog和BlogImage之间的一对一关系,其中Blog是父级,而BlogImage是子级实体。

但是,如果我们看一下创建的表格,我们会看到这个标题:

  • BlogId,博客
  • 的网址
  • BlogImageId,图片,标题, BlogId BlogImage

我在BlogImage表中对这个BlogId有些误解,我们不应该在Blog表中定义BlogImageId外键,这是什么原因,在子实体中定义外键还是在父类中?如果我们有一个孩子的一千个父母,那么子实体中就会有数千个外键!很奇怪。

2 个答案:

答案 0 :(得分:0)

文档刚刚用这种方式解释了一对一的关系,但这不是唯一的方法。你的思维方式也是正确的。以下在EF中也是有效的一对一关系。

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public int BlogImageId { get; set; }
    public BlogImage BlogImage { get; set; }
}

public class BlogImage
{
    public int BlogImageId { get; set; }
    public byte[] Image { get; set; }
    public string Caption { get; set; }    
    public Blog Blog { get; set; }
} 

答案 1 :(得分:0)

是的,对于确切的一对一关系,您应该使用此模型(您生成的表模式对应于一对多关系):

1> ssh:start().
ok
2> {ok, Pid, ConnRef} = ssh_sftp:start_channel("my.server.com").
{ok,<0.52.0>,<0.47.0>}
3> ssh_sftp:list_dir(Pid, ".").
{ok,[".login",".bash_history",".login_conf",".profile",".rhosts",".lesshst",".ssh","some","other","files",".shrc","..","."]}
4> {ok, Data} = ssh_sftp:read_file(Pid, ".login").
{ok,<<"# $FreeBSD: release/10.0.0/share/skel/dot.login 190477 2009-03-27 21:13:14Z ru $\n#\n# .login - csh login scri"...>>}