.WithMany()和.WithOptional()之间的区别?

问题描述 投票:22回答:1

以下是两种类似的流畅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()运营商之间究竟有什么区别?

entity-framework ef-code-first fluent-interface
1个回答
34
投票

如果您的模型看起来像这样:

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表只有一个单独的列CountryIdCurrencies记录可以没有相关的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 -> Countries1-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”情况下抛出预期的异常。

© www.soinside.com 2019 - 2024. All rights reserved.