我正在写没有现有数据库的实体框架模型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创建数据库模式时,它不会将它们绑定在一起。它创建单独的列:AuthorID
和UserRecord_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
向我们展示UserRecord的代码? – CodeNotFound
声音可能有点傻,但UserRecord.ID属性的类型是否与'AuthorID'属性的类型匹配?他们都是“长”吗? – Gabor
是的。更新代码以包含该代码。 – watkinsmatthewp