2017-07-26 11 views
0

私はEntity Frameworkを使用して、学習目的で単純な銀行業務アプリケーションを作成しています。私はそれがどのプロパティがnullableになり、どのプロパティがデータベース内のnull可能でない列になるかを決める方法を理解していません。Entity Framework CoreはどのプロパティがデータベースでNULLにならないのかをどのように決定しますか?

例えばこの

モデル

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はnull可能ですが、Amountではありませんか?外部キーはどうですか?FromIdToId

付録

それが関連している場合は、ここでTransactionクラスによって参照Accountクラスです。

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

ここには、一連の慣習があります。すべてを微調整することができますが、基本的なルールは明確でシンプルです。

なぜ金額は使用できませんが金額はありません。 FromIdとToIdの外部キーはどうですか?

金額はバリュータイプです。 C#プロパティーはnullにはできません。decimal?に変更すると、その列もヌル入力可能になります。
通貨は参照型(文字列)です。 FromプロパティとToプロパティも参照です。参照はALLOW-NULLにマップされます([Required]

また、DateTimeも値型です。

+0

「DateTime」タイプのタイムスタンプはどうですか?参照型でもないのでしょうか?それにもかかわらずヌル可能です。 – problemofficer

+0

私は答えを見つけたと思います。https://stackoverflow.com/a/109872/502727 – problemofficer

関連する問題