0

私は2つのEFエンティティを持っています:

public partial class CustomerEntity
{
    public int CustomerId { get; set; }
    public string CustomerName { get; set; }
    public virtual ICollection<RoleEntity> Roles { get; set; }
}

public partial class RoleEntity
{
    public int RoleId { get; set; }
    public string RoleName { get; set; }
}

これは私の挿入方法です:

public int? InsertCustomer(CustomerEntity customer)
{
    _context.CustomerEntities.Add(customer);

    try
    {
        return _context.SaveChanges();
    }
    catch (DbEntityValidationException exception)
    {
        return null;
    }
}

これは、新しい顧客を作成する方法です。

public int CreateNewCustomer(string Name)
{
    // Some mapping to CustomerEntity
    var _customerEntity = new CustomerEntity
    {
        CustomerName = Name,
        Roles = new List<RoleEntity>
        {
            new RoleEntity
            {
                RoleId = 1
            }
        }
    };
    return InsertCustomer(_customerEntity);
}

RoleEntity は「ルックアップ」テーブルです。つまり、事前設定されたレコードがあり、新しいレコードはありません。

新しい CustomerEntity が作成されるたびに、1 つ以上のロールが割り当てられます。データベースに新しいロールを作成せずに新しい CustomerEntity を挿入するにはどうすればよいですか? 上記の CreateNewCustomer メソッドは、新しい Customer と新しい Role をデータベースに挿入しますが、データベース内の既存の Role を参照する新しい Customer (ID 1) のみが必要です。

4

3 に答える 3

2

前述のように、データベースからロールをロードして顧客のRolesコレクションに追加することもできますが、「新しい」ロールをスタブオブジェクトとして使用することもできます(データベースをラウンドトリップする必要はありません)。

public int CreateNewCustomer(string Name)
{
    var role = new RoleEntity { RoleId = 1 };
    AttachEntity(role); // role is "Unchanged" now
    // Some mapping to CustomerEntity
    var customerEntity = new CustomerEntity
    {
        CustomerName = Name,
        Roles = new List<RoleEntity>{ role } // Will not set role to "Added"
    };

    return InsertCustomer(customerEntity);
}

CreateNewCustomerインスタンスを持つある種のリポジトリにあると思いDbContextます。AttachEntityエンティティをコンテキストにアタッチするだけです。

void AttachEntity<T>(T entity)
{
    this._context.Set<T>().Attach(entity);
}
于 2013-02-20T09:19:44.497 に答える
1

RoleEntityその顧客に割り当てたい を取得して、顧客ICollectionに直接追加するだけです。

于 2013-02-20T05:57:35.517 に答える
1

_content から Role エンティティをロードし、オブジェクトを _customerEntity に割り当てることができます。

public int? InsertCustomer(CustomerEntity customer, int roleId)
{
    var role =_context.Roles.Find(customer);
    _customerEntity Roles = new List<RoleEntity>{ role };
    return _context.SaveChanges();
}
于 2013-02-20T05:55:16.697 に答える