无法先播放代码

时间:2015-06-21 11:23:42

标签: c# entity-framework entity-framework-6 code-first

拥有代表模型的这个类

public class User : IHaveId
{
    public User()
    {
        Operations = new Collection<Operation>();
    }
    public int Id { get; set; }
    public string UserName { get; set; }
    public string CardNumber { get; set; }
    public string Pin { get; set; }
    public double Balance { get; set; }
    public bool Blocked { get; set; }
    public ICollection<Operation> Operations { get; set; }


}

和我自己的初始化程序中的种子方法:

    protected override void Seed(BankContext context)
    {
        var users = MockData.GetUsers();
        foreach (var user in users)
        {
            user.Operations.Add(
                    new Operation
                    {
                        OperationType = OperationType.Balance,
                        PerformTime = DateTime.Now.AddDays(-10)
                    }
            );

            user.Operations.Add(
                    new Operation
                    {
                        OperationType = OperationType.GetMoney,
                        PerformTime = DateTime.Now.AddDays(-5),
                        AdditionInformation = "800"
                    }
            );

            context.Users.Add(user);
        }
        base.Seed(context);
    }

在Add阶段有异常说:无法将Collection<Operation>强制转换为Operation。 有人可以解释为什么会这样吗?

在这种情况下,我是否需要在onModelCreating中指定一些特殊内容?

2 个答案:

答案 0 :(得分:1)

由于User.Operations应该是集合属性(而不是引用属性),因此您需要使用HasMany

modelBuilder.Entity<User>()
    .HasMany(a => a.Operations)
    .WithOptional()
    .WillCascadeOnDelete(true);

最初,您告诉EF User.Operations是一个引用属性,当您尝试为其分配集合时会导致错误。

答案 1 :(得分:0)

哦,我发现了这个问题, 我认为在发布的代码之外有一个原因。 在我的BankContext类中,我有

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<User>()
            .HasOptional(a => a.Operations)
            .WithOptionalDependent()
            .WillCascadeOnDelete(true);
    }

有些人对此有何影响。任何人都可以解释这种影响吗?