Ing*_*mar 24 entity-framework fluent-interface ef-code-first
以下是两种类似的流畅API配置:
和很多()
modelBuilder.Entity<Country>()
.HasRequired(cou => cou.Currency)
.WithMany()
.WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)
WithOptional()
modelBuilder.Entity<Country>()
.HasRequired(cou => cou.Currency)
.WithOptional()
.WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)
我在这里要表达的是:每个都Country需要具体Currency,但是Currency可以分配给零,一个或多个国家.
我必须使用上述哪一项陈述?或者换句话说:究竟有什么区别.WithMany()和.WithOptional()运营商?
Sla*_*uma 36
如果您的模型看起来像这样:
public class Country
{
public int CountryId { get; set; }
public Currency Currency { get; set; }
}
public class Currency
{
public int CurrencyId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后 ...
modelBuilder.Entity<Country>()
.HasRequired(cou => cou.Currency)
.WithOptional()
.WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)
......在数据库中创建其中一个外键关系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);
Run Code Online (Sandbox Code Playgroud)
...创建第二列 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();
Run Code Online (Sandbox Code Playgroud)
...然后第二种情况(.WithMany)工作:我们在数据库中获得两个新国家和一个货币.
然而有点奇怪的是,在第二种情况下(.HasOptional)只存储了第一个Country,第二个就被忽略了.实际上我曾期望获得例外.我不确定是否必须将其视为错误.
EDIT2
将上面示例中的顺序更改为...
context.Countries.Add(country1);
context.Countries.Add(country2);
country1.Currency = currency;
country2.Currency = currency;
Run Code Online (Sandbox Code Playgroud)
...在".HasOptional"情况下抛出预期的异常.
| 归档时间: |
|
| 查看次数: |
20931 次 |
| 最近记录: |