Entity Framework Core如何确定数据库中哪些属性为NOT NULL?

时间:2017-07-26 19:24:03

标签: ef-code-first entity-framework-core

我正在使用Entity Framework为学习目的创建一个简单的银行应用程序。我不明白它如何决定哪些属性可以为空,哪些属性成为数据库中不可为空的列。

例如这个

模型

public class Transaction
    {
        public int Id { get; set; }
        public Account From { get; set; }
        public Account To { get; set; }

        [DataType(DataType.Currency)]
        public decimal Amount { get; set; }
        public String Currency { get; set; }
        public DateTime Timestamp { get; set; }
    }

生成以下内容

SQL

enter image description here

CREATE TABLE [dbo].[Transactions] (
    [Id]        INT             IDENTITY (1, 1) NOT NULL,
    [Amount]    DECIMAL (18, 2) NOT NULL,
    [Currency]  NVARCHAR (MAX)  NULL,
    [FromId]    INT             NULL,
    [Timestamp] DATETIME2 (7)   NOT NULL,
    [ToId]      INT             NULL,
    CONSTRAINT [PK_Transactions] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Transactions_Accounts_FromId] FOREIGN KEY ([FromId]) REFERENCES [dbo].[Accounts] ([Id]),
    CONSTRAINT [FK_Transactions_Accounts_ToId] FOREIGN KEY ([ToId]) REFERENCES [dbo].[Accounts] ([Id])
);


GO
CREATE NONCLUSTERED INDEX [IX_Transactions_FromId]
    ON [dbo].[Transactions]([FromId] ASC);


GO
CREATE NONCLUSTERED INDEX [IX_Transactions_ToId]
    ON [dbo].[Transactions]([ToId] ASC);

问题

为什么Currency可以为空而不是Amount?那么外键FromIdToId

呢?

附录

如果它是相关的,这里是Account类引用的Transaction类。

public class Account
    {
        public int Id { get; set; }
        public int UserId { get; set; }    
        public User User { get; set; }

        [InverseProperty("From")]
        public ICollection<Transaction> TransactionsSend { get; set; }
        [InverseProperty("To")]
        public ICollection<Transaction> TransactionsReceived { get; set; }

        public decimal Balance { get; set; }
    }

1 个答案:

答案 0 :(得分:1)

这里有一系列惯例。您可以对所有内容进行微调,但基本规则清晰简单:

  

为什么货币可以为空而不是金额?那么外键FromId和ToId呢?

金额是一种价值型。 C#属性不能为null当您将其更改为decimal?时,该列也可以为空。
Currency是引用类型(字符串)。 From和To属性也是引用。引用将映射到ALLOW-NULL,除非您将它们标记为[Required]

而DateTime也是一种值类型。