Entity framework .Net MVC 4 REST无法发送对象

Entity framework .Net MVC 4 REST无法发送对象,entity-framework,rest,asp.net-mvc-4,asp.net-web-api,Entity Framework,Rest,Asp.net Mvc 4,Asp.net Web Api,我已经构建了一个.NETMVC4应用程序,现在我想用REST扩展它 我正在使用实体框架,我有以下问题 我的目标是建立一个系统,其中类别有许多产品,并且产品可以属于多个类别 详情如下: public class Categorie { [Key] public int Id { get; set; } [Required] public string Naam { get; set; } [Required] public string Omschr

我已经构建了一个.NETMVC4应用程序,现在我想用REST扩展它

我正在使用实体框架,我有以下问题

我的目标是建立一个系统,其中类别有许多产品,并且产品可以属于多个类别

详情如下:

public class Categorie
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Naam { get; set; }
    [Required]
    public string Omschrijving { get; set; }
    public byte[] Plaatje { get; set; }
    private List<Product> producten;
    public virtual List<Product> Producten
    {
        get { return producten; }   
        set { producten = value; }
    }
}

public class Product
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string Naam { get; set; }
        [Required]
        public string Omschrijving { get; set; }
        [Required]
        public double Prijs { get; set; }
        private List<Categorie> categorien = new List<Categorie>();

        public virtual List<Categorie> Categorien
        {
            get { return categorien; }
            set { categorien = value; }
        }
        [Required]
        public byte[] Plaatje { get; set; }
    }
第一个问题:我不能发送任何产品,只要它有一个分类。我必须把它设为空。
第二个问题:由于第一个问题,我无法发送原始产品。

我假设您的问题是序列化期间的循环引用,因为类别引用多个产品,而产品引用多个类别。一种解决方案是使用而不是返回用于EF的直线实体。为了便于将您的实体映射到我将使用的DTO。这基本上就是在RESTAPI方法中创建newProduct实例时要做的事情,但是AutoMapper从映射中去掉了硬编码和繁琐的工作。产品的DTO看起来非常相似,但它们不具有EF所需的虚拟导航属性或属性。产品的DTO应该是这样的

public class Categorie
{
    public int Id { get; set; }
    public string Naam { get; set; }
    public string Omschrijving { get; set; }
    public byte[] Plaatje { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string Naam { get; set; }
    public string Omschrijving { get; set; }
    public double Prijs { get; set; }
    public List<Categorie> categorien = new List<Categorie>();

    public List<Categorie> Categorien
    {
        get { return categorien; }
        set { categorien = value; }
    }
    public byte[] Plaatje { get; set; }
}
// GET api/Rest/5
public Product GetProduct(int id)
{
    Product product = db.Producten.Find(id);
    return Mapper.Map<Product, Dto.Product>(product);
}
公共类分类
{
公共int Id{get;set;}
公共字符串Naam{get;set;}
公共字符串Omschrijving{get;set;}
公共字节[]Plaatje{get;set;}
}
公共类产品
{
公共int Id{get;set;}
公共字符串Naam{get;set;}
公共字符串Omschrijving{get;set;}
公共双优先级{get;set;}
public List categorien=新列表();
公开名单分类
{
获取{return categorien;}
设置{categorien=value;}
}
公共字节[]Plaatje{get;set;}
}
请注意,Categorie的DTO不包含产品列表,因为在本例中,您需要产品列表。如果将DTO的字段名与实体保持相同,AutoMapper将自动处理映射。我通常为DTO保留相同的类名,只是通过使用不同的名称空间将它们与实体区分开来。您的restapi方法看起来像这样

public class Categorie
{
    public int Id { get; set; }
    public string Naam { get; set; }
    public string Omschrijving { get; set; }
    public byte[] Plaatje { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string Naam { get; set; }
    public string Omschrijving { get; set; }
    public double Prijs { get; set; }
    public List<Categorie> categorien = new List<Categorie>();

    public List<Categorie> Categorien
    {
        get { return categorien; }
        set { categorien = value; }
    }
    public byte[] Plaatje { get; set; }
}
// GET api/Rest/5
public Product GetProduct(int id)
{
    Product product = db.Producten.Find(id);
    return Mapper.Map<Product, Dto.Product>(product);
}
//获取api/Rest/5
公共产品GetProduct(内部id)
{
Product Product=db.Producten.Find(id);
返回Mapper.Map(产品);
}