Sql server 为什么';此SQL表/关系是否适用于[0..1]到[0..1]关系?
我想做一些类似的事情 但在EF核心,而不是EF 5 基本上,我想要以下关系,给定这些模型,,而不使用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],
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],我想将FK关系从Foo\u BarId设置为BarId,类似地,将FK关系从Bar\u FooId设置为FooId。本质上,Foo\u BarId和Foo\u BarId可以为空,而FooId和BarId是必需的
foo和bar的结果表如下所示(我使用了一张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编码员。从我读到的来看,这似乎是可能的。