首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使CRUD m:m关系c#

如何使CRUD m:m关系c#
EN

Stack Overflow用户
提问于 2012-07-11 01:46:35
回答 1查看 170关注 0票数 0

如何使CRUD关系m:m在我的模型中?

示例:

我的桌子

  • 人物(PeopleId,姓名)
  • 事物(ThingId,名称)
  • PeopleHasThing (PeopleId,ThingId)

我的模型

PeopleModel.cs:

代码语言:javascript
复制
    public int PeopleId { get; set; }
    public string Name
    {
        get { return _name; }
        set
        {
            if(value == _name) return;
            _name = value;
            OnPropertyChanged("Name");
        }
    }

    public List<ThingModel> HasThing
    {
        get { return _hasThing; }

        set
        {
            if(value == _hasThing) return;
            _hasThing= value;
            OnPropertyChanged("HasThing");
        }
    }

    public static int Insert(PeopleModel m)
    {
        using (_context = new myDataContext())
        {
            var d = new People
            {
                Name = m.Name
                Thing = // I don't know how to end this line
            };

            _context.People.InsertOnSubmit(d);
            _context.SubmitChanges();

            return d.PeopleId;
        }
    } 

    // I don't know how to update or retrieve this from the database
    public static void Update(PeopleModel m);
    public static void ListAll();

    // With this I dont have problem! :P
    public static void Delete(int peopleId);

PeopleHasThingModel.cs

代码语言:javascript
复制
    public int PeopleId { get; set; }
    public int ThingId  { get; set; }

ThingModel.cs

代码语言:javascript
复制
    public int ThingId { get; set; }

    public string Name
    {
        get { return _name; }
        set
        {
            if(value == _name) return;
            _name = value;
            OnPropertyChanged("Name");
        }
    }

    public bool IsMarked
    {
        get { return _isMarked; }

        set
        {
            if(value == _isMarked) return;
            _isMarked= value;
            OnPropertyChanged("IsMarked");                
        }

    }

Thing是我表单中的列表,是从thing表中填充的复选框列表。

示例

我在things表中有3条记录:

代码语言:javascript
复制
1, "house"
2, "dog"
3, "car"

我需要保存一个新的people和她的thing

人民:

代码语言:javascript
复制
   1, "ruben"

PeopleHasThing:

代码语言:javascript
复制
   1, 1 -- ruben has house
   1, 3 -- ruben has car

早期方法

PeopleModel.cs

代码语言:javascript
复制
    public static int Insert(PeopleModel m)
    {
        using (_context = new myDataContext())
        {
            var people = new People
            {
                Name = m.Name
            };

            // Create the PeopleHasThing record
            m.HasThing.ForEach((e) =>
            {
                people.PeopleHasThing.Add(new PeopleHasThing
                {
                    ThingId = e.ThingId,
                    People = people
                });
            });


            _context.People.InsertOnSubmit(people);
            _context.SubmitChanges();

            return people.PeopleId;
        }
    }

    // The following method works!
    // I've tried but I have my doubts about deleting records
    public static void Update(PeopleModel p)
    {
        using (_context = new myDataContext())
        {
            var result = (from r in _context.People
                         where r.PeopleId == p.PeopleId
                         select r).SingleOrDefault();

            if (null == result) return;

            result.Name = p.Name;

            //Delete all PeopleHasThings with result.PeopleId ...

            EntitySet<PeopleHasThing> set = new EntitySet<PeopleHasThing>();
            m.HasThing.ForEach(e =>
            {
                if (e.IsMarked)
                {
                    set.Add(new PeopleHasThing
                    {
                        ThingId = e.ThingId,
                        People = result
                    });
                }
            });

            result.PeopleHasThing = set;

            _context.SubmitChanges();
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2012-07-11 03:17:52

你的三个模特都是这样的:

代码语言:javascript
复制
class PeopleModel {
  public int PeopleID { get; set; }
  public string Name  { get; set; }
  /* .. additional fields or values .. */
}

class ThingsModel {
  public int ThingsID { get; set; }
  public string Name  { get; set; }
  /* .. additional fields or values .. */
}

class PeopleHasThing {
  public int PersonID { get; set; }
  public int ThingsID { get; set; }
}

您可以通过在人员表中只包含人员相关字段&在Things表中只包含与事物相关的字段来使用3表模型来处理这个问题。

然后,您可以将所有关系存放在PeopleHasThing表中,并根据需要使用尽可能多的行。

在创建/编辑人员和事物时,需要知道ID #才能建立关系

代码语言:javascript
复制
PeopleModel myPerson = new PeopleModel();
myPerson.PeopleID // ID of Person
ThingsModel myThing = new ThingsModel();
myThings.ThingsID // ID of Thing

PeopleHasThings relationship = new PeopleHasThings();
relationship.PeopleID = myPerson.PeopleID;
relationship.ThingsID = myThings.ThingsID;

示例

人民:

代码语言:javascript
复制
1, "ruben"
2, "joe"

事情:

代码语言:javascript
复制
1, "house"
2, "dog"
3, "car"

PeopleHasThing:

代码语言:javascript
复制
1, 1 -- ruben has house
1, 3 -- ruben has car
2, 1 -- joe has house
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11424429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档