派生クラスで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]'にキャストできません。
これにより、より多くの洞察が得られる可能性があります。