无法找到任何匹配的解决方案。
让我们指出:MVC4应用程序,EF和CodeFirstSharpMembership提供程序。
有一个实体
public class User
{
...
public virtual ICollection<Role> Roles { get; set; }
}
标准角色实体:
public class Role
{
...
public virtual ICollection<User> Users { get; set; }
}
当然,当我尝试用FK制作我自己的实体用户时
public class MyEntity
{
...
public virtual User Developer { get; set; }
}
我总是得到Self-Referrence循环,因为User引用Roles,而Roles引用User。
然后我试着去
Context = new DataContext();
Context.Configuration.LazyLoadingEnabled = false;
避免选择任何外键,并在选择之后
var Developers = Context.MyEntities;
当然,我的IQueryable没有“开发者”字段。
然后我试着:
var Developers = Context.MyEntities.Include("Developer");
当然还有自我推荐循环。
如何继续选择FKeys并从用户中排除“角色”字段?
答案 0 :(得分:3)
除非您使用的方法无法处理自引用(如序列化),否则自引用实体应该没有问题。如果您遇到序列化问题(我必须猜测,因为您没有提供任何您尝试生成错误消息的内容,很可能是序列化或数据绑定,我根本就不知道)所以我建议:
Turning off Proxy object creation on your DbContext.
DbContext.Configuration.ProxyCreationEnabled = false;
通常这种情况是因为应用程序正在使用POCO对象(T4生成或代码优先)。当Entity Framework想要跟踪对象中没有内置到POCO对象中的更改时,就会出现问题。要解决此问题,EF会创建缺少POCO对象中的属性的代理对象,并且不可序列化。
我还要补充一点XY Problem。您正在询问如何排除属性(Y问题),因为您认为它将解决问题(X问题),它可能或不可能。实际上,你需要说明源问题(X),因为很可能一个解决方案(如我所描述的)根本不需要(Y)。
答案 1 :(得分:0)
我的应用程序中有一个非常相似的结构,它也有用户和角色。我为我的应用程序做了什么(这可能是你的答案),是我有一个第三个对象UserRole,它在User和Role表之间建立一个链接表。 UserRole对象中的唯一项是用户和角色表的FK。然后将User切换为List<UserRole> Roles
,您可以从Role对象中删除User引用。
如果有效,请告诉我。
代码:
public class UserRole
{
[Key, ForeignKey("User"), ColumnAttribute(Order=0)]
public int UserID { get; set; }
[Key, ForeignKey("Role"), ColumnAttribute(Order = 1)]
public int RoleID { get; set; }
public virtual GaiaUser User { get; set; }
public virtual Role Role { get; set; }
}