0

最初に EF 4.3 コードを使用し、WCF データ サービス (リリースされたばかりの 5.0) を使用して HTTP 経由でデータを公開しています。ブラウザーからサービス操作を呼び出すと、関連するエンティティを取得できますが、消費するとクライアント アプリでのサービス操作関連のエンティティが返されません。ICollection を参照するときに仮想キーワードを使用すると、EF が遅延読み込みを有効にするようです。これは、WCF データ サービスが実際のエンティティを返すのを防ぐ方法です。私の getUsersByName メソッド関連するグループ エンティティを確認できますが、ネットワーク経由でクライアント アプリに到達すると、グループ エンティティが表示されません。これを有効にする構成はありますか。

ありがとう例えば

 public partial class Group
    {
        public Group()
        {
            this.Users = new HashSet<User>();           
        }

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int GroupID { get; set; }

        [Required(ErrorMessage = "Please enter a group name")]
        [StringLength(50, ErrorMessage = "The group name is too long")]
        public string GroupName { get; set; }

        [Required]
        public System.DateTime CreatedDate { get; set; }

        [Required]
        public bool Admin { get; set; }

        public virtual ICollection<User> Users { get; set; }

    }
    public partial class User
    {
        public User()
        {
            this.Groups = new HashSet<Group>();
        }


        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int UserID { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        [Required(ErrorMessage="Please enter a username")]
        [StringLength(50,ErrorMessage="Username is too long")]
        public string UserName { get; set; }

        [Required(ErrorMessage="Please enter an email address")]
        [RegularExpression(".+\\@.+\\..+",ErrorMessage="Please enter a valid email address")]
        public string Email { get; set; }

        [Required]
        public System.DateTime CreatedDate { get; set; }

        public virtual ICollection<Group> Groups { get; set; }
    }

    public partial class TestContext : DbContext
    {
        public Test()
            : base("name=TestEntities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            // Tell Code First to ignore PluralizingTableName convention
            // If you keep this convention then the generated tables will have pluralized names.
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        }

        public DbSet<Group> Groups { get; set; }
        public DbSet<User> Users { get; set; }

    }

    [ServiceBehavior(IncludeExceptionDetailInFaults=true)]
    [JSONPSupportBehavior]
    public class TestSVC : DataService<TestContext>
    {

        // This method is called only once to initialize service-wide policies.
        public static void InitializeService(DataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("*", EntitySetRights.All);
            config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
            config.SetServiceActionAccessRule("*", ServiceActionRights.Invoke);
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
            config.UseVerboseErrors = true;
        }        

        [WebGet]
        public User GetUserByName(string userName)
        {
            var user = (from u in this.CurrentDataSource.Users
                       where u.UserName == userName
                       select u).FirstOrDefault();

            return user;
        }
4

2 に答える 2

0

プロキシオブジェクトで問題が発生するため、コンストラクタでナビゲーションプロパティの初期化を削除してみてください。

シリアライザーがナビゲーションプロパティにアクセスすると、関連するエンティティが読み込まれるため、シリアル化で遅延読み込みを使用することはほとんど不可能です。これにより、データベース全体がロードされます。したがって、遅延読み込みを無効にして、必要なIncludeものを読み込むために使用する必要があります。または、遅延読み込みを有効にしてDTOを使用することもできます。

于 2012-05-11T04:00:38.890 に答える