ASP EF模型设计策略

时间:2013-03-27 14:32:44

标签: entity-framework database-design

“电影”表

public int movieId { get; set; }
public String movieName { get; set; }
public virtual Genres Genres { get; set; }

“类型”表

public int genreId { get; set; }
public String genreName { get; set; }

我正在寻找的是构建模型以实现以下场景的策略:

  1. 管理员输入所有类型名称,之后不再添加

  2. 非管理员输入电影,并在同一屏幕上提供包含所有“管理员类型”类型名称的下拉列表

  3. 我的问题是,当他们制作电影时,linq还想创建一个新的类型记录

    我不想再创建任何类型的记录,我只想看表格的类型列表

    有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我会更改属性名称和类名,使其更具可读性。如果将Genre表的主键列名称保留为GenreId,则EF Codefirst将创建名为Genre_GenreId !!的外键(在电影中)表。所以我将Movie类的主键列名称更改为ID,以便它将生成外键列Genre_ID

public class Movie
{
    public int ID { get; set; }
    public String MovieName { get; set; }
    public virtual Genre Genres { get; set; }
}
public class Genre
{
    public int ID { get; set; }
    public String Name { get; set; }
}

现在,在您的用户界面中,您会在下拉列表中列出Avaialble Genre记录。当用户提交表单时,请像这样保存

using (YourDBContext dbContext = new YourDBContext())
{
    Movie movie= new Movie { MovieName = "Read it from UI Please" };
    var genr=dbContext.Find(2); 
    // TO DO : replace 2 by selected value from dropdown in the UI
    movie.Genres =genr;

    dbContext.Movies.Add(movie);
    dbContext.SaveChanges();     
}

首先从db上下文加载Genre对象,并将其设置为新影片对象的Genres属性。我们使用Find方法来查找主键是传递给该函数的值的项(在本例中为2)。这将向影片表添加新记录,并将GenreID列值设置为2,假设您的流派表中有ID 2的记录

答案 1 :(得分:0)

在创建新Genre时创建新的Movie没有任何意义,插入Movie时可能会出错。以下是使用EF和MVC进行操作的提示:

// Model with foreign key
public class Movie {
    public int MovieId { get; set; }
    public string Name { get; set; }
    public Genre Genre { get; set; }
    public int GenreId { get; set; }
}

public class Genre {
    public int GenreId { get; set; }
    public string Name { get; set; }
}

// Movie Controller setting the genres for the view
public ViewResult Create() {
    // ...
    var genres = repository.Genres.All();
    ViewBag.GenreId = genres;
}

// View
@Html.DropDown("GenreId")


// Movie controller, GenreId on the model will be 
// automatically populated via model binding and the
// correct genre will be inserted
[HttpPost]
public ActionResult Create(Movie movie)
{
    if (ModelState.IsValid)
    {
        repository.Movies.Add(movie);
        repository.SaveChanges();
        // ...
    }
}
祝你好运。