我正在尝试在两个实体之间建立一对一或零关系,我希望依赖实体仍然包含自己的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属性?
干杯!
答案 0 :(得分:3)
不支持与显式FK属性的双向one-to-one
关系。
所以要么继续使用你现在拥有的东西 - Shared Primary Key association。只需从TaskId
中删除其中一个FileId
或Task
属性,然后将其余的PK(EF将自动将其用作FK,因为它是默认的EF {{ 1}}关系模型)。
或者从one-to-one
删除FieldId
属性并使用以下流畅配置(所有都是必需的):
Task
但我建议使用第一种方法(如果没有特殊原因不像现有数据库那样做),因为它得到了更好的支持 - 第二种方法包括SQL查询中的一些modelBuilder.Entity<File>()
.HasOptional(f => f.Task)
.WithRequired(t => t.File)
.Map(m => m.MapKey("FileId"))
.WillCascadeOnDelete();
你可以从这篇文章中看到EF - WithOptional - Left Outer Join?。