![](/img/trans.png)
[英]Code First EF5: One-to-Zero-or-One relationship is not working
[英]EF code first - configure One-to-Zero-or-One relationship without shared PK/FK
我试图在两个实体之间建立一对零或一个关系,并且我希望从属实体仍包含其自己的Indentity列,而不是作为共享密钥。
我想尽可能多地遵循约定,而不要显式声明不需要显式声明的任何内容(因此,没有不必要的数据注释或流畅的api子句)
实体:
public class File
{
public int FileId {get;set;}
//some omitted file properties
public virtual Task Task {get;set;}
}
public class Task
{
public int TaskId {get;set;}
//some omitted task properties
public int FileId {get;set;}
public virtual File File {get;set;}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<File>().HasOptional(f => f.Task).WithRequired(t => t.File);
base.OnModelCreating(modelBuilder);
}
这将创建一个奇怪的关系,其中TaskId既是Tasks表的PK列,也是FK列。 我认为该值应该与文件ID相同? (这是一个问题:)
因此,如何使TaskId保持其自己的顺序值并使FileId成为Files表的外键?
也许在1-0..1的情况下,我宁愿摆脱TaskId属性,而将FileId设为PK / FK属性?
干杯!
不支持具有显式FK属性的双向one-to-one
关系。
因此,要么继续使用您现在拥有的“ 共享主键”关联 。 只需从Task
TaskId
或FileId
属性之一,然后将其余的作为PK(EF将自动将其用作FK,因为这是默认的EF one-to-one
关系模型)。
或从Task
删除FieldId
属性,并使用以下流利的配置(所有步骤都是必需的):
modelBuilder.Entity<File>()
.HasOptional(f => f.Task)
.WithRequired(t => t.File)
.Map(m => m.MapKey("FileId"))
.WillCascadeOnDelete();
但是我建议使用第一种方法(如果没有特殊的理由不像现有数据库那样使用它),因为它得到了更好的支持-第二种方法包括在SQL查询中的一些LEFT OUTER JOIN
,您可以从EF这篇文章中看到- WithOptional-左外部联接? 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.