实体框架5在选择时排除属性

时间:2012-12-18 19:55:06

标签: entity-framework asp.net-mvc-4

无法找到任何匹配的解决方案。  让我们指出: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并从用户中排除“角色”字段?

2 个答案:

答案 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; }
}