Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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
Sql server 为什么';此SQL表/关系是否适用于[0..1]到[0..1]关系?_Sql Server_Entity Framework Core_Ef Code First - Fatal编程技术网

Sql server 为什么';此SQL表/关系是否适用于[0..1]到[0..1]关系?

Sql server 为什么';此SQL表/关系是否适用于[0..1]到[0..1]关系?,sql-server,entity-framework-core,ef-code-first,Sql Server,Entity Framework Core,Ef Code First,我想做一些类似的事情 但在EF核心,而不是EF 5 基本上,我想要以下关系,给定这些模型,,而不使用 class-foo{ 公共int FooId{get;set;} 公共字符串FooName{get;set;} 公共int Foo_BarId{get;set;} } 分类栏{ 公共int BarId{get;set;} 公共字符串BarName{get;set;} 公共int Bar_FooId{get;set;} } 为什么不可能执行以下操作 注意,FooId和BarId是主键[PK],

我想做一些类似的事情 但在EF核心,而不是EF 5

基本上,我想要以下关系,给定这些模型,,而不使用

class-foo{
公共int FooId{get;set;}
公共字符串FooName{get;set;}
公共int Foo_BarId{get;set;}
}
分类栏{
公共int BarId{get;set;}
公共字符串BarName{get;set;}
公共int Bar_FooId{get;set;}
}
为什么不可能执行以下操作

注意,FooIdBarId是主键[PK],我想将FK关系从Foo\u BarId设置为BarId,类似地,将FK关系从Bar\u FooId设置为FooId。本质上,Foo\u BarIdFoo\u BarId可以为空,而FooIdBarId是必需的

foobar的结果表如下所示(我使用了一张html图片,因为这里很难发布html呈现的内容)


为什么这是不允许的?或者,如果是,对于
builder.HasOne.WithOne
,有什么神奇的命令?

您可以在Bar表中的两条记录中指定一个22的Bar\u FooId值。这是一对多,而不是一对一,从Foo到Bar。将违反1到[0..1]的约束

1到[0..1]关系可以使用在右侧为NOT NULL筛选的唯一索引。对于关系的“0”部分,筛选器允许多条记录为NULL。除了这些空值,右侧的值是唯一的

一对多关系右侧的索引不能是唯一的

到目前为止,另一种关系不是一对多的关系。但现在说还为时过早

编辑:

好吧,我倒过来了。需要建立这些关系,并且需要筛选索引,因为您不需要1对多。关于我会做什么,这里有一个彻底的争论。我认为这是错误的,因为我不是EF人

class foo {
    public int FooId { get; set; }
    public string FooName { get; set; }
    [ForeignKey("BarId")] 
    public int Foo_BarId { get; set; }
}
class bar {
    public int BarId { get; set; }
    public string BarName { get; set; }
    [ForeignKey("FooId")] 
    public int Bar_FooId { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Bar>()
        .HasKey(z => z.BarID)
        .HasOne(a => a.Foo)
        .WithOne(b => b.Bar)
        .HasForeignKey<Bar>(b => b.Bar_FooId);

    modelBuilder.Entity<Foo>()
        .HasKey(z => z.FooID)
        .HasOne(a => a.Bar)
        .WithOne(b => b.Foo)
        .HasForeignKey<Foo>(b => b.Foo_BarId);
}
class-foo{
公共int FooId{get;set;}
公共字符串FooName{get;set;}
[外国钥匙(“BarId”)]
公共int Foo_BarId{get;set;}
}
分类栏{
公共int BarId{get;set;}
公共字符串BarName{get;set;}
[外键(“FooId”)]
公共int Bar_FooId{get;set;}
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.HasKey(z=>z.BarID)
.HasOne(a=>a.Foo)
.带一个(b=>b.Bar)
.HasForeignKey(b=>b.Bar\u FooId);
modelBuilder.Entity()
.HasKey(z=>z.FooID)
.HasOne(a=>a.Bar)
.WithOne(b=>b.Foo)
.HasForeignKey(b=>b.Foo_BarId);
}
检查数据库以确保已筛选出所需的唯一索引。如果根据此链接手动添加,则支持它们。如果指定了.IsUnique(),则会自动包括NULL上的筛选器。(如果不希望对其进行过滤,则必须将其删除。)


我很守旧。对我来说,在T-SQL中更容易看到这一点。请随意记下我的错误。

这段关系的目的是什么?你有真实的场景吗?我有一个主帐户(main)和一个第三方帐户(TP)。只能有一个主帐户与一个第三方帐户关联(反之亦然)。这是一对一的部分。我还想创建一个主帐户而不创建第三方帐户(反之亦然)。这是零或一[0..1]到[1]部分(反之亦然,使[0..1]到[0..1])。连接表意味着它是一种多对多关系。我不想将Main与许多第三方联系起来(反之亦然),也不想让未来的开发人员这样做。为什么不使用这种方法呢?这是1对1我需要[0..1]到[0..1]你可以轻松地将它设为0对1。
这是从Foo到Bar的1对多,而不是1对1。将违反1到[0..1]的约束
\n\n是的,请参阅条形表第4行(不可设置…)旁边的注释。因此,是的,当有人试图创建类似第4行的条目时,我希望数据库(或实体框架)引发异常。好的,很抱歉造成混淆。我会修改我的答案,谢谢您的尝试,但我可以立即看到您的代码无法编译,例如HasKey()有一个分号,然后紧接着是一个.HasOne。我已经多次尝试将此设置正确,因此,如果您愿意的话,我可以向您展示我的接近程度。外键必须可以为null(
int?
),否则关系永远不能是可选的。如何强制两个外键始终指向正确的对象而不是
foo1→ bar1→ foo2
?或
foo1→ bar1
bar1
@John中没有FK值,这是一次徒劳的尝试。正如我所说,我不是EF编码员。从我读到的来看,这似乎是可能的。