gpt4 book ai didi

c# - 具有单独 ID 属性的 EF6 一对一关系

转载 作者:太空宇宙 更新时间:2023-11-03 22:49:12 24 4
gpt4 key购买 nike

我们需要定义以下实体之间的一对一关系:

public class Foo
{
[Key, Column("Foo_ID")]
public int Id { get; set; }

public Bar Bar { get; set; }
}

public class Bar
{
[Key, Column("Bar_ID")]
public int Id { get; set; }

[Column("Bar_Foo_ID")]
public int? FooId { get; set; }

public Foo Foo { get; set; }
}

我们需要迁移旧版软件并让它们暂时并排运行。所以我们不能改变任何关系。不幸的是,数据库中没有定义外键。

modelBuilder.Entity<Foo>()
.HasOptional(a => a.Bar)
.WithRequired(x => x.Foo)
.WillCascadeOnDelete(true);

当我们查询Foo时和 Include(x => x.Bar)它使用 LEFT OUTER JOIN bars ON Foo_ID = Bar_ID 创建一个 SQL 查询这是错误的。

我们需要将其更改为 LEFT OUTER JOIN bars on Foo_ID = Bar_Foo_ID ,但我不确定 Entity Framework 如何支持它,因为我们的数据库和 Bar_ID 中没有外键作为主键。

我知道可能有不止一个 Bars一个Foo , 但有没有办法强制建立一对一关系?

Foo已创建,一个 Bar始终为它创建。

最佳答案

对于遗留数据,您可以使用以下内容:

1 : 0-1 关系基本上是 1 : 多关系的一种特殊形式。

因此您可以在 Entity Framework 中将关系配置为 1:many 并可能向外键属性添加唯一索引以强制执行最大约束。一个相关条目。

public class Foo
{
[Key, Column("Foo_ID")]
public int Id { get; set; }

// this can't be a single reference property unfortunately... but it will only contain 0 or 1 object when working with it.
public ICollection<Bar> Bars { get; set; }
}

public class Bar
{
[Key, Column("Bar_ID")]
public int Id { get; set; }

[Index(IsUnique = true)]
[Column("Bar_Foo_ID")]
public int? FooId { get; set; }

public Foo Foo { get; set; }
}

modelBuilder.Entity<Foo>()
.HasMany(a => a.Bars)
.WithRequired(x => x.Foo)
.HasForeignKey(x => x.FooId)
.WillCascadeOnDelete(true);

关于c# - 具有单独 ID 属性的 EF6 一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48316803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com