将属性设置为另一个属性的值

时间:2017-03-27 18:34:52

标签: c# asp.net asp.net-mvc

我对此很陌生,我的问题非常特别。我已经google了很多,但却找不到任何相关内容。我在数据库中有两个属性,StartDate和StartMonth。 StartDate的类型为DateTime,StartMonth的类型为字符串类型。 (我知道将这两者都保存到数据库中是愚蠢的,但这不是我可以改变的,因为我没有权限这样做。)我的问题是如何在DB模型中将StartMonth设置为相等StartDate中的月份(因为它是相同的)?相反,这样做的正确方法是什么?任何帮助都非常感谢!

要明确我目前:

[Table("EMPLOYMENT")]
public class Employment : EntityBase
{   
    [Column("STARTDATE")]
    public DateTime? StartDate { get; set; }

    [Column("STARTMONTH")]
    public string StartMonth { get; set; }
}

编辑: 我尝试了下面的内容(我意识到这不是任何建议,但它是由同事建议的):

[Table("EMPLOYMENT")]
public class Employment : EntityBase
{   
    [Column("STARTDATE")]
    internal DateTime? StartDateInternal { get; set; }

    [Column("STARTMONTH")]
    private string StartMonth { get; set; }

    [NotMapped]
    public DateTime? StartDate
    {
        get
        {
            return StartDateInternal;
        }
        set
        {
            StartDateInternal = value;
            StartMonth = value?.ToString("MMMM");
        }
}

具体来说,StartMonth现在是私有的,StartDate现在是一个NotMapped属性,它设置StartDateInternal和StartMonth并返回StartDateInternal值,而前一代码中的原始StartDate现在名为StartDateInternal。虽然我可以看到值正在一直传递到模型,但它不会设置值。它总是在数据库中将其设置为NULL。我不知道为什么,并且想知道是否有人能够理解为什么。

4 个答案:

答案 0 :(得分:1)

您可以使用 支持字段 ,仅在 StartMonth值不是来自StartDate 时获取月份组。

function cleanUp2() {
  var threads = GmailApp.search("SOME SEARCH");
  Logger.log(threads.length);

  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    Logger.log(messages.length);

    for (var j = 0; j < messages.length; j++){
      if (messages[j].isDraft()){
        Logger.log('me' + 'id msg: ' + messages[j].getId());
        deleteMessage('me',messages[j].getId());
      }    
    }
  }
}

    function deleteMessage(userId, messageId) {
      var request = gapi.client.gmail.users.messages.delete({
        'userId': userId,
        'id': messageId
      });
      request.execute(
        function(resp) { });
    }

答案 1 :(得分:0)

将您的二传手标记为function onEdit(e) { if (e.source.getActiveSheet().getName() !== "Input" || e.range.rowStart != 36 || e.range.columnStart != 4 | e.value !== "Submit") return e.source.getActiveSheet() .getRange("E3:E36") .setValue(e.source.getSheetByName("MasterList") .getRange("A5:AG5") .getValue()) } ,然后创建一个设置两个属性的private方法。

SetStartDate

另一种模拟方法是将[Table("EMPLOYMENT")] public class Employment : EntityBase { [Column("STARTDATE")] public DateTime? StartDate { get; private set; } [Column("STARTMONTH")] public string StartMonth { get; private set; } public string SetStartDate(DateTime? startDate) { this.StartDate = startDate; this.StartMonth = startDate.HasValue ? startDate.Value.ToString("MMMM") : null; } } 的setter标记为StartMonth,并让private的setter设置两个属性:

StartDate

答案 2 :(得分:0)

您不应映射StartMonth属性,因此它不会保存在数据库中,但模型仍将具有该属性。你可以这样做:

    [NotMapped]
    public string StartMonth
    {
        get
        {
            return StartDate?.Month.ToString();
        }
    }

其中NotMapped属性告诉EF不映射此属性,但您可以在代码中使用此属性。此外,您不需要set属性,因为StartMonth将返回StartDate月。这种方式可以确保StartMonth和StartDate.Month没有不同的值。

答案 3 :(得分:0)

你能改变数据库设计吗?

如果是这样,请在数据库中使用触发器或其他工具将STARMONTH列呈现为伪列,返回&#34; month&#34; STARTDATE列的值。

如果没有,那么您可以在处理新的StartDate时设置StartMon:

clear;
clc;

my_image = imread('acetylation.tif');

for i = 1:6

[x_coord, y_coord, intensities]=impixel(my_image);  
avg_y = (sum(y_coord))/2;

imshow(my_image);
line([x_coord(1,:),x_coord(2,:)],[avg_y,avg_y], 'Color', 'white')
hold on;

end

数据库伪列将保证所有数据库客户端的结果一致。以上代码适用于使用此代码的任何内容。