我正在使用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; }
}
生成以下内容
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
?那么外键FromId
和ToId
?
如果它是相关的,这里是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; }
}
答案 0 :(得分:1)
这里有一系列惯例。您可以对所有内容进行微调,但基本规则清晰简单:
为什么货币可以为空而不是金额?那么外键FromId和ToId呢?
金额是一种价值型。 C#属性不能为null
当您将其更改为decimal?
时,该列也可以为空。
Currency是引用类型(字符串)。 From和To属性也是引用。引用将映射到ALLOW-NULL,除非您将它们标记为[Required]
而DateTime也是一种值类型。