有关背景信息,请参阅以下帖子:
我一直认为这ForeignKey
用于显示类中哪个属性持有确定导航属性的ForeignKey,例如
public class MemberDataSet
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? DeferredDataId { get; set; }
[ForeignKey("DeferredDataId")]
public virtual DeferredData DeferredData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是,我在链接的帖子上发现这是不对的,因为DeferredData的主键被称为Id我实际需要:
public class MemberDataSet
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? DeferredDataId { get; set; }
[ForeignKey("Id")]
public virtual DeferredData DeferredData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
即ForeignKey
用于指向其他类.
然后我继续改变其他一些参考文献:
public class MemberDataSet
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { …
Run Code Online (Sandbox Code Playgroud) c# entity-framework foreign-keys code-first shared-primary-key
编辑此问题,以期使其更清楚。
我们有实体框架代码优先设置。为了示例目的,我简化了两个类,实际上,与“记录”类似,大约有十多个类,其中“项”是导航属性/外键。
物品类别:
public class Item
{
public int Id { get; set; }
public int AccountId { get; set; }
public List<UserItemMapping> UserItemMappings { get; set; }
public List<GroupItemMapping> GroupItemMappings { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
记录类:
public class Record
{
public int ItemId { get; set; }
public Item Item { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
this.User是每个存储库中注入的用户对象,包含在存储库库中。我们有一个包含以下代码的Item存储库:
var items = this.GetAll()
.Where(i => i.AccountId == this.User.AccountId);
Run Code Online (Sandbox Code Playgroud)
我在存储库的基础上创建了follow表达式,以轻松地对其进行过滤(以希望再次使用)。由于LINQ to实体的工作方式,我们无法使用静态扩展方法(System.NotSupportedException“ LINQ to Entities无法识别方法X,并且该方法无法转换为存储表达式。”)。
protected Expression<Func<Item, bool>> ItemIsOnAccount()
{
return item => item.AccountId …
Run Code Online (Sandbox Code Playgroud)