以下是两种类似的流畅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()运营商?
我正在使用EF4 CTP 5,CodeFirst.
请先看我的课程:
public class Guest
{
[Key]
public Guid GuestID { get; set; }
public Language PreferredLanguage { get; set; }
public Guid? LanguageID { get; set; }
}
public class Language
{
[Key]
public Guid LanguageID { get; set; }
[Required(ErrorMessage = "Enter language name")]
[StringLength(50, ErrorMessage = "Language name is too long")]
public string LanguageName { get; set; } // in origine language
}
Run Code Online (Sandbox Code Playgroud)
我的目标是为访客语言关系设置一定的"删除规则".删除语言时,我不想删除相应的guest虚拟机(因此无级联删除).相反,我希望客人的LanguageID为"Set NULL".
我希望流利的API在这里支持我.但我找不到任何有用的东西.WillCascadeOnDelete(bool),它不提供我需要的选项.我错过了什么吗?或者这只是在CTP 5中没有实现?
谢谢你的帮助!
我使用EF 4.1 RC和CodeFirst/POCO按代码构建我的数据库.
想象一下,像师生一样有多对多的关系(一个教师可以有很多学生,一个学生可能有很多老师).因此,我有两个POCO:(1)教师和(2)学生.
当EF创建相应的表格时,您将最终得到三个表格:(1)教师,(2)学生和(3)额外的联接表格.连接表恰好包含两个字段:Teacher_ID和Student_ID.
我想知道我是否有机会在联接表中添加额外的字段,例如"成绩"(某位老师给某位老师的成绩)?
目前我不知道如何只用两个POCO来实现这一点.
所以我想我能做的就是手动创建第三个POCO(用于连接表),对吗?这肯定会奏效,但后来我失去了很好的导航属性,如oneTeacher.Students.First()等.这是我仍在寻找另一种方式的主要原因.
我不得不承认,EF 4.1 RC Codefirst,DataAnnotations和FluentAPI的功能对我来说仍然是压倒性的.有时我真的不知道我在做什么;-)请看下面的POCO:
public class Country
{
[Key]
public Guid ID { get; set; }
[Required]
public virtual Currency Currency { get; set; }
}
public class Currency
{
[Key]
public Guid ID { get; set; }
public virtual ICollection<Country> Countries { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
总体思路:每个国家都需要有货币.但是根本不需要将货币分配给一个国家.
如果让EF创建相应的数据库,则按照约定将关系设置为CASCADE DELETE.换句话说:如果删除货币,也会删除相应的国家/地区.但就我而言,这不是我想要的.
我在FluentAPI中想出了一些代码来禁用CASCADE DELETE:
modelBuilder.Entity<Country>()
.HasRequired(cou => cou.Currency)
.WithOptional()
.WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)
我认为这意味着:每个国家都需要一种货币.此货币可能有零个,一个或多个国家/地区(可选).每当我删除一种货币时,相应的国家(如果有的话)都不会被级联删除.
令人惊讶的是,如果删除相应的货币,给定的方法仍会级联删除国家/地区.任何人都可以告诉我我想念的是什么吗?
fluent-interface cascading-deletes ef-code-first entity-framework-4.1