EF InvalidCastException具有一对多关系

时间:2013-09-01 19:06:57

标签: c# entity-framework .net

在添加一对多关系实体时,我收到了InvalidCaseException。它在Add not on the SaveChanges上失败。

  

无法投射类型的对象   输入'System.Collections.Generic.List`1 [UserAccount]'   'UserAccount'。

将X的集合添加到X

的一个实例中

(家长或一个实体)

[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false), Serializable()]
public class Merchant
{   

    /// <summary>
    /// Standard ID
    /// </summary>
    [Key]
    [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    [DataType(DataType.Text), MaxLength(100)]
    /// <summary>
    /// UserFriendly Name 
    /// </summary>
    public string MerchantName { get; set; }

    /// Billing Information
    /// </summary>
    public virtual ICollection<BillingTransactions> BillingTransactions { get; set; }

    /// <summary>
    /// List of Accounts for this merchant  (pulled from DBAccounts)
    /// </summary>
    public virtual ICollection<UserAccount> UserAccounts { get; set; }
 }

(孩子或许多人)

public class UserAccount
{

    private string loginID;
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    /// <summary>
    /// Standard ID 
    /// </summary>
    public int ID { get; set; }

    public int MerchantId { get; set; }

    [ForeignKey("ID")]    
    public Merchant Merchant { get; set; }
  //Obviously there are more properties here....
 }

我按如下方式创建新实体:

 public void CreateNewMerchant(UserAccount useraccount)
    {
        Merchant merchant;
        if (useraccount.Merchant == null) //New unknown merchant
        {
            merchant = new Model.Merchant.Merchant();
            merchant.UserAccounts = new List<UserAccount>();
            merchant.UserAccounts.Add(useraccount);
        }
        else
        {
            merchant = useraccount.Merchant;
        }

        ServiceBase<Merchant> sb = new Core.ServiceBase<Merchant>();
        base.Add(merchant); 
        base.Save();




    }

这是一个类似于表单界面的向导。第一步是创建一个useraccount。下一步是填写新的商家信息。向导步骤正在创建子对象useraccount和空父对象,然后在下一步中创建父对象。

我的代码正在创建一个空白/空父项,并将child / useraccount添加到空商家并添加到数据库中。

为什么我收到了无效的演员豁免?

1 个答案:

答案 0 :(得分:1)

你需要......

[ForeignKey("MerchantId")]
public Merchant Merchant { get; set; }

...而不是[ForeignKey("ID")],它将使用主键作为外键,因此定义一对一而不是一对多的关系。