实体框架 – EF 4.1:.WithMany()和.WithOptional()之间的区别?

以下是两个类似流畅的API配置:

WithMany()

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

WithOptional()

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

我想在这里表达的是:每个国家都需要具体的货币,但货币可以分配零个,一个或多个国家。

我必须使用以上哪些语句?或者换句话说:.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同时为主键和“货币”表的CurrencyId的外键,因此“国家”表只有一列CountryId。货币记录可以在没有相关国家记录的情况下生效。但是,如果货币记录具有相关的国家记录,则不超过一个,因为外键是CountryId,它同时是主键,因此只能在一个记录中。所以关系货币 – >国家是1比0 … 1。

另一个例子

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

…在数据库的“国家/地区”表格中创建第二列CurrencyId,该表格不可为空,并且是货币表的CurrencyId的外键。所以在这里,货币记录可能没有相关的国家/地区记录,也可能是一个或多个,因为外键现在是另一个列,与主键不相同。因此,“国家”表中的多行可能具有相同的外键。关系货币 – >这里的国家是1到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)中,只有第一个国家被存储,第二个被忽略。其实我曾经有过例外。我不知道这是否被认为是一个错误。

EDIT2

将上述示例中的顺序更改为…

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

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

…在“.HasOptional”案例中抛出预期的异常。

http://stackoverflow.com/questions/5421707/ef-4-1-difference-between-withmany-and-withoptional

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:实体框架 – EF 4.1:.WithMany()和.WithOptional()之间的区别?