46

Entity Framework Code First アプローチでは、POCO の EntityConfiguration クラスでプロパティの既定値をどのように設定しますか?

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedOn { get; set; }
}

public class PersonConfiguration : EntityConfiguration<Person>
{
    public PersonConfiguration()
    {
        Property(p => p.Id).IsIdentity();
        Property(p => p.Name).HasMaxLength(100);

        //set default value for CreatedOn ?
    }
}
4

7 に答える 7

24

Entity Framework 4.3 のリリースでは、移行を通じてこれを行うことができます。

EF 4.3 Code First 移行のチュートリアル

したがって、あなたの例を使用すると、次のようになります。

public partial class AddPersonClass : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "People",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Name = c.String(maxLength: 100),
                    CreatedOn = c.DateTime(nullable: false, defaultValue: DateTime.UtcNow)
                })
            .PrimaryKey(t => t.Id);
    }

    public overide void Down()
    {
        // Commands for when Migration is brought down
    }
}
于 2012-02-24T14:58:58.520 に答える
15

クラスのコンストラクターを介してデフォルト値を設定できます。MVC3 と Entity Framework 4.1 を使用して、現在のプロジェクトにあるクラスを次に示します。

namespace MyProj.Models
{
using System;
using System.Collections.Generic;

public partial class Task
{
    public Task()
    {
        this.HoursEstimated = 0;
        this.HoursUsed = 0;
        this.Status = "To Start";
    }

    public int ID { get; set; }
    public string Description { get; set; }
    public int AssignedUserID { get; set; }
    public int JobID { get; set; }
    public Nullable<decimal> HoursEstimated { get; set; }
    public Nullable<decimal> HoursUsed { get; set; }
    public Nullable<System.DateTime> DateStart { get; set; }
    public Nullable<System.DateTime> DateDue { get; set; }
    public string Status { get; set; }

    public virtual Job Job { get; set; }
    public virtual User AssignedUser { get; set; }
}
}
于 2011-06-01T12:58:14.597 に答える
7

このトピックがしばらく続いていることは知っていますが、ある種の同じ問題に遭遇しました。これまでのところ、すべてを 1 か所にまとめてコードを読めるようにする解決策を見つけることができませんでした。

private settersユーザーの作成時に、コンストラクターを「汚染」せずに、GUID と作成日など、オブジェクト自体によっていくつかのフィールドを設定したいと考えています。

私のユーザークラス:

public class User
{
    public static User Create(Action<User> init)
    {
        var user = new User();
        user.Guid = Guid.NewGuid();
        user.Since = DateTime.Now;
        init(user);
        return user;
    }

    public int UserID { get; set; }

    public virtual ICollection<Role> Roles { get; set; }
    public virtual ICollection<Widget> Widgets { get; set; }

    [StringLength(50), Required]
    public string Name { get; set; }
    [EmailAddress, Required]
    public string Email { get; set; }
    [StringLength(255), Required]
    public string Password { get; set; }
    [StringLength(16), Required]
    public string Salt { get; set; }

    public DateTime Since { get; private set; }
    public Guid Guid { get; private set; }
}

呼び出しコード:

context.Users.Add(User.Create(c=>
{
    c.Name = "Name";
    c.Email = "some@one.com";
    c.Salt = salt;
    c.Password = "mypass";
    c.Roles = new List<Role> { adminRole, userRole };
}));
于 2012-05-30T20:20:02.520 に答える
4

残念ながらできません。http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/a091ccd6-0ba8-4d4f-8f5e-aafabeb258e4

于 2010-06-29T07:03:52.307 に答える
3

どのバージョンの EF でこれが利用可能になるかはわかりませんが、バージョン 5 の時点で、これを確実に処理できます。TSQL またはデザイナーのいずれかで、SQL の列に GetDate() の既定値を設定するだけで、次のように EF クラスをセットアップします。

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedOn { get; set; }
}

public class PersonConfiguration : EntityConfiguration<Person>
{
    public PersonConfiguration()
    {
        Property(p => p.Id).IsIdentity();
        Property(p => p.Name).HasMaxLength(100);

        this.Property(p => p.CreatedOn ).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed);
    }
}

データベース列または POCO プロパティを null 可能にする必要がないことに注意してください。

于 2013-04-02T23:06:40.873 に答える