1

派生クラスでICollectionsを実行しようとしてnewいます。これは、オブジェクトコンストラクターで実行する必要がありますか、またはオブジェクトの新しいインスタンスを作成するときに実行する必要がありますRegister ActionResult()か?

テナントはUserProfileから継承します-簡略化された例:

public class Tenant : UserProfile
{
    public Tenant() 
    {
        this.ReferencePhotos = new List<ReferencePhoto>();
        // ReferencePhoto extends Image
    }

    // A Tenant can have many ReferencePhotos
    [ForeignKey("ImageId")] // Id of parent class
    public virtual ICollection<ReferencePhoto> ReferencePhotos { get; set; }
}

上記を実行しようとしましたが、InvalidCastExceptionが発生します。

タイプ'System.Collections.Generic.List'1[Namespace.Models.ReferencePhoto]'のオブジェクトをタイプ[Namespace.Models.ReferencePhoto]'にキャストできません。

同じオブジェクトから別のオブジェクトにキャストしようとするのはなぜですか?

私の場合、Register ActionResult()これも試しました(オブジェクトコンストラクターでICollectionsを設定する場合としない場合)。

public ActionResult Register(RegisterModel model)
{
    using (var db = new LetLordContext())
    {
        var tenant = db.UserProfile.Create<Tenant>();
        tenant.ReferencePhotos = new List<ReferencePhoto>();
        // Do I need to new it here at all/as well?
        db.UserProfile.Add(tenant);     // Exception being thrown here
        db.SaveChanges();

        Roles.AddUserToRole(model.UserName, "Tenant");

        WebSecurity.Login(model.UserName, model.Password);
        return RedirectToAction("Confirm", "Home", tenant);
     } 
}

上記も前述の同じ例外をスローします。誰かが何か洞察を提供できますか?

編集: UserProfileコードを追加しました

public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
    public int UserId { get; set; }

    [Display(Name = "Username")]
    [Required(ErrorMessage="Username is required.")]
    public string UserName { get; set; }

    [Display(Name = "First name")]
    [Required(ErrorMessage = "First name is required.")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Account type is required.")]
    public AccountType AccountType;

    public virtual string AccountTypeString
    {
        get { return AccountType.ToString(); }
        set
        {
            AccountType newValue;
            if (Enum.TryParse(value, out newValue))
            { AccountType = newValue; }
        }
    }
}

編集:コンテキストコードとReferencePhotoコードを追加しました

public class LetLordContext : DbContext
{
    public DbSet<LetLord.Models.UserProfile> UserProfile { get; set; }                  // 1 DbSet for superclass UserProfile
    public DbSet<LetLord.Models.Image> Image { get; set; }                              // 1 DbSet for superclass Image
    public DbSet<LetLord.Models.ResidentialProperty> ResidentialProperty { get; set; }
    public DbSet<LetLord.Models.TenantGroupMember> TenantGroupMember { get; set; }
    public DbSet<LetLord.Models.Viewing> Viewing { get; set; }
    public DbSet<LetLord.Models.TenantPreferences> TenantPreferences { get; set; }
    public DbSet<LetLord.Models.LandlordPreferences> LandlordPreferences { get; set; }
    public DbSet<LetLord.Models.Address> Address { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

私は型ごとのテーブル継承を使用しているDbSetため、基本クラスのsのみが実装されます。

public class ReferencePhoto : Image
{
    // 1:many with Tenant
    public int UserId { get; set; }
    [ForeignKey("UserId")]
    public virtual Tenant Tenant { get; set; }
}

この問題を回避するには、オブジェクトコンストラクターでリストを初期化しないか、新しいエンティティを作成します。これを実現するために、部分ビューでオブジェクトActionResultを返すGETでnull合体演算子を使用します。Tenant部分的に、私は。かどうかを確認しますModel.ReferencePhotos == null。そうである場合、ユーザーは写真をアップロードできます。写真をアップロードするとリストに追加されますので、データベースで確認できます。ただし、再度ログインすると、if前述の部分ビューで次の例外がスローされます。

タイプSystem.Data.Entity.DynamicProxies.Tenant_..にフィールド/プロパティReferencePhotosを設定できません。

内部例外を除いて:

タイプ'System.Data.Entity.DynamicProxies.ReferencePhoto_3DFB9F64061D55E5AF6718A74C97025F77EFB2BB9C2A6E43F5A6AF62A6A73E75'のオブジェクトをタイプ'System.Collections.Generic.ICollection`1[LetLord.Models.ReferencePhoto]'にキャストできません。

これにより、より多くの洞察が得られる可能性があります。

4

1 に答える 1

1

削除してみてください...

[ForeignKey("ImageId")] // Id of parent class

コレクションではなく、(1対多の一種の)「1」側に設定する必要があるForeignKeyであり、(すでに属性を設定している)でのみ定義されReferencePhotoますUserId

...そしてそれは余分な外部キーを追加することになるかもしれません-そしてその結果としてそのsingle instance vs collectionエラーが発生します。



ForeignKeyどのように定義されるべき かについてのいくつかのより多くの情報(ForeignKey vs InversePropertyなど)、そして教祖からのいくつかの良いアドバイス:)

Entity Framework4.1InverseProperty属性

MVC3でCodeFirstEntity Framework(4.1)を使用して外部キー関係を宣言するにはどうすればよいですか?


より複雑なシナリオ(多対多で、流暢なコードで手動で関係を定義することをお勧めします)については、少し前に作成したこれらの詳細な例を見てください。必要なマッピングのほとんどが含まれています。

codefirstまたはfluentAPIを使用した同じエンティティとの多対多(テーブルに参加)の関係?

結合テーブルで最初のFluentAPIとナビゲーションプロパティをコーディングする

EFコード-追加データを含む最初の多対多

于 2013-03-25T15:28:05.890 に答える