Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF代码优先-配置一对零或无共享PK/FK的一对一关系_C#_Sql Server_Entity Framework - Fatal编程技术网

C# EF代码优先-配置一对零或无共享PK/FK的一对一关系

C# EF代码优先-配置一对零或无共享PK/FK的一对一关系,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我试图在两个实体之间建立一对零或一的关系,我希望依赖实体仍然包含自己的标识列,而不是共享键 我希望尽可能多地遵循约定,不要显式声明任何不需要显式声明的内容(因此,不要不必要的数据注释或fluent-api子句) 实体: public class File { public int FileId {get;set;} //some omitted file properties public virtual Task Task {get;set;} } public cl

我试图在两个实体之间建立一对零或一的关系,我希望依赖实体仍然包含自己的标识列,而不是共享键

我希望尽可能多地遵循约定,不要显式声明任何不需要显式声明的内容(因此,不要不必要的数据注释或fluent-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);
        }
公共类文件
{
public int FileId{get;set;}
//一些省略的文件属性
公共虚拟任务任务{get;set;}
}
公开课任务
{
public int TaskId{get;set;}
//一些省略的任务属性
public int FileId{get;set;}
公共虚拟文件{get;set;}
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().has可选(f=>f.Task).WithRequired(t=>t.File);
基于模型创建(modelBuilder);
}
这会创建一个奇怪的关系,其中TaskId同时是Tasks表的PK和FK列。我认为这意味着它应该与文件ID具有相同的值?(这是一个问题:))

那么,如何使TaskId保持其自身的顺序值,并使FileId成为Files表的外键呢

或者,在1-0..1的情况下,我宁愿放弃TaskId属性,而让FileId成为PK/FK属性


干杯

不支持具有显式FK属性的双向一对一
关系

所以要么继续使用你现在拥有的-。只需去掉
Task
中的一个
TaskId
FileId
属性,并将其余属性设置为PK(EF将自动将其用作FK,因为这是默认的EF
一对一关系模型)

或者从
Task
中删除
FieldId
属性,并使用以下流畅配置(所有配置都是必需的):

modelBuilder.Entity()
.has可选(f=>f.Task)
.WithRequired(t=>t.File)
.Map(m=>m.MapKey(“文件ID”))
.WillCascadeOnDelete();

但我建议使用第一种方法(如果没有特殊原因不使用现有数据库等),因为它得到了更好的支持-第二种方法包括SQL查询中的一些
左外连接,正如您在本文中看到的那样。

非常感谢,回答很好:)
modelBuilder.Entity<File>()
    .HasOptional(f => f.Task)
    .WithRequired(t => t.File)
    .Map(m => m.MapKey("FileId"))
    .WillCascadeOnDelete();