3

そのテーブルにレコードが入力されるたびにデフォルト値に設定したいDateTimeフィールドがあります(これは基本的にDateCreatedフィールドです)。これは私のコードです

public partial class User
    {
        public User()
        {
            this.DateCreated = DateTime.Now; //set default value
            Roles = new HashSet<Role>();
        }

        public ICollection<Role> Roles { get; set; } //many to many relationship

        public int UserId { get; set; }
        public string FirstName { get; set; }
        public string Surname { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }
        public string City { get; set; }

        //foreign key
        public int CountryId { get; set; }
        //navigation properties
        public virtual Country Country { get; set; }

        //foreign key
        public int LanguageId { get; set; }
        //navigation properties
        public virtual Language Language { get; set; }

        public string EmailAddress { get; set; }
        public long FacebookId { get; set; }
        public DateTime DateCreated { get; set; }
    } }

    public class UserConfiguration : EntityTypeConfiguration<User>
    {
        public UserConfiguration()
        {
            ToTable("Users", schemaName: "Main");

            HasKey(s => s.UserId);

            Property(p => p.FirstName)
                .IsRequired().HasMaxLength(50); //translates to non-nullable     

            Property(p => p.Surname)
                .IsRequired().HasMaxLength(50);

            Property(p => p.Username)
                .IsRequired().HasMaxLength(20);

            Property(p => p.Password)
                .IsRequired().HasMaxLength(20);

            Property(p => p.City)
                .IsOptional().HasMaxLength(50); //not required

            Property(p => p.LanguageId)
                .IsRequired();

            Property(p => p.EmailAddress)
                .IsRequired().HasMaxLength(50);

            Property(p => p.FacebookId)
                .IsOptional();

            Property(p => p.DateCreated) 
                .IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            //attribute ensures that DateCreated only gets saved to the database when you are adding a 
            //row, not when you are saving
        }
    }

    context.Users.Add(new User
                {
                    FirstName = "Test",
                    Surname = "User",
                    Username = "testuser72",
                    Password = "testuser72",
                    City = "London",
                    CountryId = context.Countries.Single(d => d.CountryName == "United Kingdom").CountryId,
                    LanguageId = context.Languages.Single(d => d.LanguageName == "English").LanguageId,
                    EmailAddress = "testuser@yahoo.co.uk",
                    Roles = new Role[] { context.Roles.Single(r => r.RoleName == "Content Editor"), context.Roles.Single(s => s.RoleName == "User") }
                });

上記のコードを使用してユーザーを追加しようとすると、「値NULLを列「DateCreated」、テーブル「Main.Users」に挿入できません」というエラーが発生するのはなぜですか。列はnullを許可しません。INSERTは失敗します。

4

2 に答える 2

4

オプション「HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)」を使用すると、自動インクリメント列にしたいと言います。これはあなたが望むものではありません。計算済みが必要です。これは、値がユーザーではなくデータベースによって自動的に入力されることを意味します。

このオプションを変更するだけでは問題は解決しません。Computed に設定すると、独自の値を取得したくないので、コンストラクターで設定しても意味がありません。データベース レベルでデフォルト値を「GETDATE()」に設定する必要があります。移行を使用する場合は、文字列を defaultValueSql パラメーターに追加します。

于 2012-11-18T13:02:03.723 に答える