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");

そしてもちろん、自己参照ループを取得しました。

FKeysを選択し続け、「Role」フィールドをユーザーから除外するにはどうすればよいですか?

4

2 に答える 2

3

自己参照を処理できないメソッド(シリアル化など)を使用していない限り、自己参照エンティティに問題はありません。シリアル化の問題が発生している場合(エラーメッセージを生成しようとしているものが何も提供されていないため、推測する必要があります。おそらく、シリアル化またはデータバインディングは、私にはわかりません)。

DbContextでのプロキシオブジェクトの作成をオフにします。

DbContext.Configuration.ProxyCreationEnabled = false;

通常、このシナリオは、アプリケーションがPOCOオブジェクト(T4生成またはコードファーストのいずれか)を使用しているためです。この問題は、EntityFrameworkがPOCOオブジェクトに組み込まれていないオブジェクトの変更を追跡する場合に発生します。これを解決するために、EFは、POCOオブジェクトの属性がなく、シリアル化できないプロキシオブジェクトを作成します。

また、 XY問題があることも付け加えておきます。あなたはそれが問題(X問題)を解決すると思うのでプロパティ(Y問題)を除外する方法を尋ねています、そしてそれはそうでないかもしれません。実際には、(Y)をまったく必要としない解決策(私が説明したような)が存在する可能性が高いため、ソースの問題(X)を述べる必要があります。

于 2012-12-18T21:40:35.450 に答える
0

私のアプリケーションには非常によく似た構造があり、ユーザーとロールもあります。私が自分のアプリケーションに対して行ったこと(そしてこれがあなたの答えかもしれません)は、ユーザーテーブルとロールテーブルの間にリンクテーブルを作成する3番目のオブジェクトである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 に答える