Ubi*_*MNJ 7 entity-framework code-first entity-framework-4.1
我有一个与自己有关系的班级:
public class Person
{
public long ID { get; set; }
public string Name { get; set; }
public virtual Person Mother { get; set; }
public virtual Person Father { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当EF 4.1试图映射这个类时,我得到了以下错误:'无法确定类型'Model.Person'和'Model.person'之间关联的主要结束.必须使用关系流畅API或数据注释显式配置此关联的主要结尾.
我已经尝试了EF 4.1主题- 模型关系的解决方案,但没有成功.
我怎么解决这个问题?
谢谢!
因为它自然是一对多的关系(一个人必须有一个父亲和一个母亲,但可以有许多儿子和女儿)我会像这样建模:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.HasRequired(p => p.Father)
.WithMany();
modelBuilder.Entity<Person>()
.HasRequired(p => p.Mother)
.WithMany();
}
Run Code Online (Sandbox Code Playgroud)
这将在数据库表中创建两个必需的外键,其名称Mother_ID和Father_ID约定.
编辑
如果您希望能够创建没有母亲和父亲的人,您可以将关系设为可选而非必需:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.HasOptional(p => p.Father)
.WithMany();
modelBuilder.Entity<Person>()
.HasOptional(p => p.Mother)
.WithMany();
}
Run Code Online (Sandbox Code Playgroud)
然后数据库表中的外键可以为空.
如果您不喜欢外键(Mother_ID和Father_ID)的默认列名,则可以自定义映射中的列名:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.HasOptional(p => p.Father)
.WithMany()
.Map(m => m.MapKey("FatherID"));
modelBuilder.Entity<Person>()
.HasOptional(p => p.Mother)
.WithMany()
.Map(m => m.MapKey("MotherID"));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3801 次 |
| 最近记录: |