实体框架在数据库中创建新条目而我没有告诉它

时间:2015-12-15 20:23:26

标签: c#

我有一个应该作为银行(学校项目)工作的应用程序。

我有五个班级

  1. 列表项
  2. 客户
  3. 帐户
  4. 交易
  5. 逻辑
  6. 存储库
  7. Customer我有

    Public virtual list<Account> Accounts
    

    Account我有

    Public Virtual Customer Customer
    

    我有客户客户,以便实体框架知道该帐户属于谁

    Transactions我有

    Public Account Account
    

    现在我遇到问题,例如我想从我的应用程序向客户添加帐户,然后将其添加到数据库中的Account表。 如果我这样做,Entity Framework出于某种原因在Customer表中添加了一个新Customer。这是代码:

    public void DbAddAccount(Account account) 
    { 
        using (var db = new Data.BankContext()) 
        { 
            db.Accounts.Add(account); 
            db.SaveChanges(); 
        } 
    }
    

    如果我在Transactions表中添加一个条目,它将在表格中添加一个新帐户和一个新客户。

    基于我的代码

    在数据库中创建以下内容
     "dbo.Accounts",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Balance = c.Decimal(nullable: false, precision: 18, scale: 2),
                        Interestrate = c.Decimal(nullable: false, precision: 18, scale: 2),
                        AccountType = c.String(),
                        AccountNumber = c.Int(nullable: false),
                        LoanInterestRate = c.Decimal(precision: 18, scale: 2),
                        CreditLine = c.Decimal(precision: 18, scale: 2),
                        MaxFreeWhitdraws = c.Boolean(),
                        Discriminator = c.String(nullable: false, maxLength: 128),
                        Customer_Id = c.Int(),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.Customers", t => t.Customer_Id)
                .Index(t => t.Customer_Id);
    
            CreateTable(
                "dbo.Customers",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        FirstName = c.String(),
                        LastName = c.String(),
                        SSN = c.String(),
                    })
                .PrimaryKey(t => t.Id);
    
            CreateTable(
                "dbo.Transactions",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Date = c.DateTime(nullable: false),
                        TransactionType = c.String(),
                        Amount = c.Decimal(nullable: false, precision: 18, scale: 2),
                        Balance = c.Decimal(nullable: false, precision: 18, scale: 2),
                        Account_Id = c.Int(),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.Accounts", t => t.Account_Id)
                .Index(t => t.Account_Id);
    

    我在哪里弄错了?

1 个答案:

答案 0 :(得分:1)

这是因为你的外键限制。

您的Transactions表格中有一个不可为空的列(Account_Id),它是Accounts表的外键。这意味着必须Account_Id的值,而值必须对应Id表中的Accounts值。当您向Transactions表添加条目而未指定Account_Id时,EF&#34;有帮助&#34;使用默认值创建新的Accounts条目,并使用其Id作为Account_Id值。

由于AccountsCustomers之间也存在外键关系,因此同样的流程也适用于此(以及任何其他)新添加的帐户。