2016-04-26 86 views
0

我正在写没有现有数据库的实体框架模型Code-First。在我的对象,我已经说过我是一个对许多外国的关系既明确和延迟加载导航性能是这样的:为什么实体框架不尊重我的外键?

UserRecord类

[Key] 
public long ID { get; set; } 

public virtual List<WorkItemRecord> WorkItemsAuthored { get; set; } // authored work items 

WorkItemRecord类:

[Key] 
public long ID { get; set; } 

public long AuthorID { get; set; } // user ID of the author 
public virtual UserRecord Author { get; set; } // navigation lazy-loaded property 

将外键作为ID以及WorkItemRecord类中的导航属性维护的想法是,在我只需要实际的底层作者的用户ID的情况下,我可以直接引用它,而无需调用属性并产生nother数据库查找。

问题是,当EF创建数据库模式时,它不会将它们绑定在一起。它创建单独的列:AuthorIDUserRecord_ID

我想起初也许这是因为我的财产是Author而不是User。然而,即使当我明确指定它使用属性属性... ...

[ForeignKey("Author")] 
public long AuthorID { get; set; } 
public virtual UserRecord Author { get; set; } 

......我仍然结束了生成的模式中的那些相同的两列。

还试图把装饰的其他财产...

public long AuthorID { get; set; } 
[ForeignKey("AuthorID")] 
public virtual UserRecord Author { get; set; } 

...,仍然得到同样的结果。

如果可能的话,我想避免使用Fluent API,但如果我无法获得任何其他解决方案,我会接受。

任何想法?

谢谢!

UPDATE

感谢所有帮助! Fluent API工作正常,但用反向属性修饰器修复数据注释证明要容易得多。最终的解决方案:

UserRecord类:

public long ID { get; set; } 
public virtual List<WorkItemRecord> WorkItemsAuthored { get; set; } 

WorkItemRecord类:

public long ID { get; set; } 

[ForeignKey("Author")] 
public long AuthorUserID { get; set; } 

[InverseProperty("WorkItemsAuthored")] 
public virtual UserRecord Author { get; set; } 

微软也有一篇文章谈论这个具体问题:

https://msdn.microsoft.com/en-us/data/jj591583.aspx#Relationships

+0

向我们展示UserRecord的代码? – CodeNotFound

+0

声音可能有点傻,但UserRecord.ID属性的类型是否与'AuthorID'属性的类型匹配?他们都是“长”吗? – Gabor

+0

是的。更新代码以包含该代码。 – watkinsmatthewp

回答

1

引用属性应该足以让EF识别一对多关系,但是您是否也有UserRecord类中的导航属性?

public class UserRecord 
{ 
    /* other properties */ 
    public virtual List<WorkItemRecord> WorkItemsAuthored { get; set; } 
} 

也许有一个小的细节导致EF无法识别外键。

UPDATE:UserRecord类尝试InverseProperty如下:

[InverseProperty("WorkItemsAuthored")] 
public virtual UserRecord Author { get; set; } // navigation lazy-loaded property 

从 “编程实体框架:代码优先”,由朱莉娅·勒曼和罗恩·米勒写道:

。 ..你可能遇到实体之间存在多重关系的场景。在这些情况下,Code First将无法确定哪些导航属性匹配。

我假设UserRecord班有一个以上的List<WorkItemRecord>

+0

是的。更新了有问题的代码以包含更多上下文。 – watkinsmatthewp

+0

更新了我的答案,以便您可以使用数据注释。这可能会解决您的问题。 – Gabor

2

在您的DbContext类将此添加到y我们的OnModelCreating方法。

modelBuilder.Entity<Book>() //Guessing at your class name 
    .HasRequired(e => e.Author) 
    .WithMany(e => e.Books) 
    .HasForeignKey(e => e.AuthorID); 

这将强制约束。

+0

这个作品,谢谢!然而,我仍然希望找到一种方法来使用装饰器属性来代替流畅的API,因为这对未来的其他开发者来说会更容易 – watkinsmatthewp