EF 6和Web API错误添加实体与现有实体

时间:2015-06-16 05:44:37

标签: c# entity-framework api

我使用Web API创建了一个REST服务,我使用的是EF Code First。 我的问题是,当我添加一个具有现有关系的实体foreignId = 1时,EF会向我添加关系并使用foreignId = 2返回我的实体。

POST object
{
 "nom":"Test",
 "actif":true,
 "provinceId":1,
 "province":{
    "id": 1,
    "nom": "Province ok",
    "actif": true
 }
}

Return object

    {
        "id": 1,
        "nom": "Test",
        "actif": true,
        "provinceId": 2,
        "province": {
            "id": 2,
            "nom": "Province ok"
        },

    }

我还会使用这种风格的存储库模式。

     public abstract class ServiceCrud<TEntity> : ServiceBase
            where TEntity : EntityBase
        {

            public virtual object Get()
            {
                // Context.
                return Ctx.Set<TEntity>().OrderBy(x => x.Nom).ToList();

            }

            public virtual async Task<object> Get(int id)
            {
                // Context.
                var entity = await Ctx.Set<TEntity>().FindAsync(id);

                // Return.
                return entity;
            }

            public virtual async Task<object> Add(TEntity entity)
            {
                // Check Validity.
                CheckValidity(entity);

                // Context.
                Ctx.Set<TEntity>().Add(entity);
                await Ctx.SaveChangesAsync();

                // Return.
                return entity;
            }

            public virtual async Task<object> Update(TEntity entity)
            {
                // Check Validity.
                CheckValidity(entity);

                // Context.
                Ctx.Entry(entity).State = EntityState.Modified;
                await Ctx.SaveChangesAsync();

                // Return.
                return entity;
            }

            public virtual void CheckValidity(TEntity entity)
            {
                // Nom unique.
                var entityBase = Ctx.Set<TEntity>().AsNoTracking().FirstOrDefault(x => x.Nom == entity.Nom);

                if (entityBase != null && (entity.Id == null || entity.Id != entityBase.Id))
                    throw new ValidationException("Le nom doit être unique");

            }
        }

感谢您的帮助。

亚历

1 个答案:

答案 0 :(得分:0)

如果我覆盖我的方法,那没关系。

public override async Task<object> Add(Commune entity)
    {
        // Check Validity.
        CheckValidity(entity);

        // Context.
        Ctx.Set<Commune>().Add(entity);
        Ctx.Set<Province>().Attach(entity.Province);

        await Ctx.SaveChangesAsync();

        // Return.
        return entity;
    }

但是没有更通用的方法吗?