2

找不到任何匹配的解决方案。让我们切入正题: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; }
}

我总是得到自引用循环,因为用户引用角色,角色引用用户。
然后我试着

Context = new DataContext();
Context.Configuration.LazyLoadingEnabled = false;

为了避免选择任何外键,并在选择某些东西之后

var Developers = Context.MyEntities;

当然,我的 IQueryable 没有“开发人员”字段。
然后我尝试:

var Developers = Context.MyEntities.Include("Developer");

当然还有自引用循环。

如何继续选择 FKey 并从用户中排除“角色”字段?

4

2 回答 2

3

除非您使用无法处理自引用的方法(如序列化),否则自引用实体应该没有问题。如果您遇到序列化问题(我不得不猜测,因为您没有提供任何您试图生成错误消息的内容,很可能是序列化或数据绑定,我根本不知道)所以我建议:

关闭 DbContext 上的代理对象创建。

DbContext.Configuration.ProxyCreationEnabled = false;

通常这种情况是因为应用程序正在使用 POCO 对象(T4 生成或代码优先)。当实体框架想要跟踪未内置于 POCO 对象中的对象中的更改时,就会出现问题。为了解决这个问题,EF 创建了缺少 POCO 对象中的属性且不可序列化的代理对象。

我还要补充一点,你有一个XY 问题。您在问如何排除一个属性(Y 问题),因为您认为它会解决一个问题(X 问题),它可能会也可能不会。实际上,您需要说明源问题(X),因为很可能存在根本不需要(Y)的解决方案(如我所描述的)。

于 2012-12-18T21:40:35.450 回答
0

我的应用程序中有一个非常相似的结构,它也有用户和角色。我为我的应用程序所做的(这可能是你的答案)是我有第三个对象,UserRole,它在用户表和角色表之间建立了一个链接表。UserRole 对象中的唯一项目是 User 和 Role 表的 FK。然后将 User 切换为拥有 a 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; }
}
于 2012-12-18T20:32:07.867 回答