gpt4 book ai didi

entity-framework - .WithMany() 和 .WithOptional() 的区别?

转载 作者:行者123 更新时间:2023-12-03 10:56:51 33 4
gpt4 key购买 nike

下面是两个类似的 fluent API 配置:

WithMany()

modelBuilder.Entity<Country>()
.HasRequired(cou => cou.Currency)
.WithMany()
.WillCascadeOnDelete(false);

WithOptional()
modelBuilder.Entity<Country>()
.HasRequired(cou => cou.Currency)
.WithOptional()
.WillCascadeOnDelete(false);

我在这里想表达的是:每 Country需要混凝土 Currency ,但是一个 Currency可以分配给零个、一个或多个国家。

我必须使用上述哪些语句?或者换句话说: .WithMany() 之间究竟有什么区别?和 .WithOptional()运营商?

最佳答案

如果您的模型如下所示:

public class Country
{
public int CountryId { get; set; }
public Currency Currency { get; set; }
}

public class Currency
{
public int CurrencyId { get; set; }
}

然后 ...
modelBuilder.Entity<Country>()
.HasRequired(cou => cou.Currency)
.WithOptional()
.WillCascadeOnDelete(false);

... 在数据库中创建外键关系,其中 CountryIdCountries表是 CurrencyId 的主键和外键的 Currencies表同时,所以 Countries表有 只有一列 CountryId .一个 Currencies记录可以在没有相关的情况下存活 Countries记录。但是如果一个 Currencies记录有相关 Countries记录然后不超过一个,因为外键是 CountryId它同时是主键,因此只能在一个记录中。所以关系 Currencies -> Countries1-to-0...1 .

另一个例子...
modelBuilder.Entity<Country>()
.HasRequired(cou => cou.Currency)
.WithMany()
.WillCascadeOnDelete(false);

... 创建 第二列 CurrencyIdCountries不可为空且是 CurrencyId 的外键的数据库表的 Currencies table 。所以这里有可能是 Currencies记录没有相关 Countries记录或一个或多个,因为外键现在是另一列,与主键不同。因此在 Countries中不止一行表可能有相同的外键。关系 Currencies -> Countries这是 1-to-0...n .

编辑

如果您对两种不同配置的模型采用以下代码...
Country country1 = new Country();
Country country2 = new Country();
Currency currency = new Currency();

country1.Currency = currency;
country2.Currency = currency;

context.Countries.Add(country1);
context.Countries.Add(country2);

context.SaveChanges();

...然后第二种情况 (.WithMany) 有效:我们在数据库中得到两个新国家和一种货币。

然而有点奇怪的是,在第二种情况下 (.HasOptional) 只存储第一个 Country,第二个被简单地忽略。其实我原以为会有异常(exception)。我不确定是否必须将其视为错误。

编辑 2

将上例中的顺序更改为...
context.Countries.Add(country1);
context.Countries.Add(country2);

country1.Currency = currency;
country2.Currency = currency;

...在“.HasOptional”情况下抛出预期的异常。

关于entity-framework - .WithMany() 和 .WithOptional() 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5421707/

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