MVC4 / EF / Code First - 在派生类中实例化ICollections时出现InvalidCastException

时间:2013-03-25 12:12:37

标签: c# entity-framework inheritance asp.net-mvc-4 code-first

我试图在我的派生类中new ICollections - 这应该在对象构造函数中完成还是/当我在{{1}中创建对象的新实例时}}?

租户继承自UserProfile - 简化示例:

Register ActionResult()

我已尝试执行上述操作,但会导致InvalidCastException:

  

无法转换类型&System; System.Collections.Generic.List' 1 [Namespace.Models.ReferencePhoto]'输入[Namespace.Models.ReferencePhoto]'。

为什么在它们相同的情况下尝试从一个对象转换为另一个对象?

在我的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; } } 我也尝试了这个(在对象构造函数中设置和不设置ICollections):

Register ActionResult()

以上也引发了前面提到的同样的异常。任何人都可以提供任何见解吗?

编辑:添加了UserProfile代码

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

编辑:添加了上下文代码和ReferencePhoto代码

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; }
        }
    }
}

我使用了每个类型的表继承,因此只实现了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

我可以通过不初始化对象构造函数中的列表或创建新实体来解决此问题。为了实现这一点,我在GET public class ReferencePhoto : Image { // 1:many with Tenant public int UserId { get; set; } [ForeignKey("UserId")] public virtual Tenant Tenant { get; set; } } 中使用了一个空合并运算符,它在局部视图中返回一个ActionResult对象。在部分中,我检查是否Tenant。如果是,用户可以上传照片。上传照片时,它会被添加到列表中,我可以通过检查数据库来确认。但是,当我再次登录时,前面提到的局部视图中的Model.ReferencePhotos == null会引发以下异常:

  

无法在System.Data.Entity.DynamicProxies.Tenant _...

类型上设置字段/属性ReferencePhotos

内部异常:

  

无法转换类型为&#39; System.Data.Entity.DynamicProxies.ReferencePhoto_3DFB9F64061D55E5AF6718A74C97025F77EFB2BB9C2A6E43F5A6AF62A6A73E75&#39;输入&#39; System.Collections.Generic.ICollection`1 [LetLord.Models.ReferencePhoto]&#39;。&#34;}

这可能会提供更多见解。

1 个答案:

答案 0 :(得分:1)

尝试删除...

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

应该在'one'侧设置的ForeignKey(一对多 - 排序   ),永远不会在收藏品上 - 而且只在ReferencePhoto上定义(通过UserId   你已经归因于。)

...和可能会添加额外的外键 - 并导致single instance vs collection错误。



关于如何定义ForeignKeyForeignKey vs InverseProperty等)的更多信息,以及来自大师的一些好建议:)

Entity Framework 4.1 InverseProperty Attribute

How Should I Declare Foreign Key Relationships Using Code First Entity Framework (4.1) in MVC3?

<小时/> 对于更复杂的场景(使用多对多和手动定义流畅代码中的关系 - 我建议) - 看看我前面提到的这些详细示例 - 它具有您可能需要的大多数映射。

Many to many (join table) relationship with the same entity with codefirst or fluent API?

Code First Fluent API and Navigation Properties in a Join Table

EF code-first many-to-many with additional data