.WithMany()和.WithOptional()之间的区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.WithMany()和.WithOptional()之间的区别?相关的知识,希望对你有一定的参考价值。
以下是两种类似的流畅API配置:
和很多()
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);
...在数据库中创建一个外键关系,其中CountryId
表中的Countries
是主键,同时是CurrencyId
表的Currencies
的外键,因此Countries
表只有一个单独的列CountryId
。 Currencies
记录可以没有相关的Countries
记录。但是如果Currencies
记录有一个相关的Countries
记录,那么不超过一个,因为外键是CountryId
,它同时是主键,因此只能在一个记录中。所以Currencies -> Countries
的关系是1-to-0...1
。
另一个例子......
modelBuilder.Entity<Country>()
.HasRequired(cou => cou.Currency)
.WithMany()
.WillCascadeOnDelete(false);
...在数据库的CurrencyId
表中创建第二列Countries
,该表是不可为空的,并且是CurrencyId
表的Currencies
的外键。因此,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,第二个就被忽略了。实际上我曾期望获得例外。我不确定是否必须将其视为错误。
Aaditi
将上面示例中的顺序更改为...
context.Countries.Add(country1);
context.Countries.Add(country2);
country1.Currency = currency;
country2.Currency = currency;
...在“.HasOptional”情况下抛出预期的异常。
以上是关于.WithMany()和.WithOptional()之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章
MapKey 与 HasForeignKey 的区别 - Fluent Api